我目前正在编写一些代码,其中我使用了很多文件。我使用Java 7 nio类Paths和Path实现了所有文件路径处理(连接,规范化等)。在Windows上,一切都按预期工作,但在Linux上,Paths类行为似乎已被破坏。
例如以下代码:
System.out.println(File.separator);
System.out.println(FileSystems.getDefault());
Path path = Paths.get("../dir1/", "\\dir2\\file1").toAbsolutePath().normalize();
System.out.println(path);
if(path.toFile().exists()) {
System.out.println(path + " exists");
}
Windows上的打印以下输出:
\
sun.nio.fs.WindowsFileSystem
D:\projects\dir1\dir2\file1
true
但是Java 1.7.0_79(64位)和Java 1.8.0_60(64位)上的Linux Ubuntu 14.04上的相同代码使路径未规范化:
/
sun.nio.fs.LinuxFileSystem
/home/semi/dir1/\dir2\file1
即使文件位于路径/home/semi/dir1/dir2/file1
,也会被path.toFile().exists()
报告为不存在。
我看了一下LinuxFileSystem.java和WindowsFileSystem.java,似乎在Windows上检查了/
和\
字符的路径(WindowsPathParser.isSlash(char c)
方法)。 Linux实现不应该这样做吗?
这是sun.nio.fs.LinuxFileSystem
实施中的错误还是我做错了什么?
你也知道任何替代方法,以确保正确解析和规范化Linux路径(无需手动完成所有解析)。
答案 0 :(得分:0)
Windows 上的 Java 是针对 Microsoft C++ 标准库编译的,允许反斜杠或正斜杠作为有效的路径分隔符。因此,反斜杠仅在 Windows 上运行时才是有效的路径分隔符,而正斜杠在任何地方都有效。
即使在 Windows 上,唯一需要反斜杠的时间是在创建将传递给 CMD.EXE、PowerShell 以及可能的其他终端/shell 的命令行时。还有一些开源库需要在文件路径中使用反斜杠(在 Windows 上运行时),但 java 本身允许在文件路径中使用正斜杠或反斜杠。
恕我直言,在解析输入时使用 File.separator 通常会导致可避免的错误,而在生成供软件或人类眼球使用的输出时,它具有有效的作用。