为什么File.pathSeparatorChar在Windows上是分号?

javadoc声明File.pathSeparatorChar是:

与系统相关的路径分隔符。 初始化此字段以包含系统属性path.separator的值的第一个字符。 此字符用于分隔作为路径列表给出的文件序列中的文件名。 在UNIX系统上,此字符为: ; 在Microsoft Windows系统上它是;

但这看起来很奇怪,因为分号不是Windows路径的禁用字符(对于引用,它们是\ / : * ? " < > | ,参见Windows资源管理器的重命名function)。

例如,使用以下代码:

 String test = "C:\\my;valid;path" + File.pathSeparator + "C:\\Windows"; String[] tests = test.split(File.pathSeparator); 

tests将包含C:\\my valid path C:\\Windows ,这不是它所期望的。

所以问题是:为什么这个字符不是冒号,就像在Unix上一样? 我可以强制我的代码使用冒号,但这似乎打败了在JDK中保持常量的目的。

编辑:Reimeus解释了为什么它不能成为Windows上的冒号(它是驱动器分隔符),但我真正感兴趣的是它不是一个不能出现在路径中的字符的原因,例如|

PATH分隔符很长一段时间都是分号,大概是从MS-DOS的第一个版本开始。 (根据Thorsten的回答,我假设Java只是简单地遵循Windows约定,大概是因为Java程序员可能会认为他们可以使用pathSeparatorChar来解析PATH的值,而不仅仅是解析Java本身生成的文件列表。)

这种分隔符最明显的选择(通过类比英语)是句点,逗号和分号。 该期间将与8.3文件名格式冲突。 分号对逗号的选择可能是任意的。

无论如何,当时分号在文件名中不是合法字符 ,因此没有理由更喜欢逗号。 而且,当然,既然现在逗号和分号都是合法的,如果他们有,我们就不会有任何好转。 🙂

您将路径分隔符与目录分隔符混淆。

路径分隔符用于分隔PATH环境变量中的路径条目。 它是; 在Windows上。 例如:

 PATH=C:\Windows;C:\Program Files 

指定文件或文件夹名称时,目录分隔符会分隔单个文件夹名称。 在Windows上它是\ 。 例如:

 C:\Windows\Temp\Test.txt 

在我们在评论中讨论之后,我终于明白了你的问题:-D“问题”可能只能由微软回答。 它是 – 我同意你的意思 – 使用文件夹名称中允许的分隔符并不是一个明智的想法。 也许这来自8个字符名称的旧时代?

真正的问题应该是你如何确定是否; 是文件夹的一部分或充当分隔符。 我自己会问这个问题 ,因为我觉得这很有趣。

冒号:用于表示驱动器号