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

Mét*_*ule 5 java

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上的冒号(它是驱动器分隔符),但我真正感兴趣的是它不是一个不能出现在路径中的字符的原因,例如|.

Tho*_*mar 8

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

路径分隔符用于分隔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个字符名称的旧时代?

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


Har*_*ton 4

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

这种分隔符(类似于英语)最明显的选项是句号、逗号和分号。该句点会与 8.3 文件名格式冲突。选择分号而不是逗号很可能是任意的。

无论如何,当时分号在文件名中不是合法字符,因此没有理由更喜欢逗号。当然,由于现在逗号和分号都是合法的,所以如果它们有的话我们的情况也不会更好。:-)