Java Paths.get()在Linux上的奇怪行为

时间:2015-09-08 08:24:19

标签: java linux windows path java-7

我目前正在编写一些代码,其中我使用了很多文件。我使用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.javaWindowsFileSystem.java,似乎在Windows上检查了/\字符的路径(WindowsPathParser.isSlash(char c)方法)。 Linux实现不应该这样做吗?

这是sun.nio.fs.LinuxFileSystem实施中的错误还是我做错了什么?

你也知道任何替代方法,以确保正确解析和规范化Linux路径(无需手动完成所有解析)。

1 个答案:

答案 0 :(得分:0)

Windows 上的 Java 是针对 Microsoft C++ 标准库编译的,允许反斜杠或正斜杠作为有效的路径分隔符。因此,反斜杠仅在 Windows 上运行时才是有效的路径分隔符,而正斜杠在任何地方都有效。

即使在 Windows 上,唯一需要反斜杠的时间是在创建将传递给 CMD.EXE、PowerShell 以及可能的其他终端/shell 的命令行时。还有一些开源库需要在文件路径中使用反斜杠(在 Windows 上运行时),但 java 本身允许在文件路径中使用正斜杠或反斜杠。

恕我直言,在解析输入时使用 File.separator 通常会导致可避免的错误,而在生成供软件或人类眼球使用的输出时,它具有有效的作用。