javadoc表示File.pathSeparatorChar:
与系统相关的路径分隔符.此字段初始化为包含系统属性path.separator的值的第一个字符.此字符用于分隔作为路径列表给出的文件序列中的文件名.在UNIX系统上,此字符是
:; 在Microsoft Windows系统上它是;.
但这看起来很奇怪,因为分号不是Windows路径的禁用字符(对于引用,这些是\ / : * ? " < > |Windows资源管理器的重命名功能).
例如,使用以下代码:
String test = "C:\\my;valid;path" + File.pathSeparator + "C:\\Windows";
String[] tests = test.split(File.pathSeparator);
Run Code Online (Sandbox Code Playgroud)
tests将包含C:\\my valid path C:\\Windows,这不是它所期望的.
所以问题是:为什么这个字符不是冒号,就像在Unix上一样?我可以强制我的代码使用冒号,但这似乎打败了在JDK中保持常量的目的.
编辑:Reimeus解释了为什么它不能成为Windows上的冒号(它是驱动器分隔符),但我真正感兴趣的是它不是一个不能出现在路径中的字符的原因,例如|.
您将路径分隔符与目录分隔符混淆.
路径分隔符用于分隔PATH环境变量中的路径条目.它;在Windows上.例如:
PATH=C:\Windows;C:\Program Files
Run Code Online (Sandbox Code Playgroud)
指定文件或文件夹名称时,目录分隔符会分隔单个文件夹名称.它\在Windows上.例如:
C:\Windows\Temp\Test.txt
Run Code Online (Sandbox Code Playgroud)
在我们在评论中讨论后,我终于明白了你的问题:-D"问题"可能只能由微软回答.它是 - 我同意你的意思 - 使用文件夹名称中允许的分隔符并不是一个明智的想法.也许这来自8个字符名称的旧时代?
真正的问题应该是如何确定它;是文件夹的一部分还是充当分隔符.我自己会问这个问题,因为我觉得这很有趣.
PATH 分隔符在很长一段时间内一直是分号,大概是从 MS-DOS 的第一个版本开始。(根据 Thorsten 的回答,我假设 Java 只是遵循 Windows 约定,大概是因为 Java 程序员可能认为他们可以用来pathSeparatorChar解析 PATH 的值,而不仅仅是解析 Java 本身生成的文件列表。 )
这种分隔符(类似于英语)最明显的选项是句号、逗号和分号。该句点会与 8.3 文件名格式冲突。选择分号而不是逗号很可能是任意的。
无论如何,当时分号在文件名中不是合法字符,因此没有理由更喜欢逗号。当然,由于现在逗号和分号都是合法的,所以如果它们有的话我们的情况也不会更好。:-)