【发布时间】:2015-12-03 20:12:40
【问题描述】:
我目前正在编写一些代码,我在其中经常处理文件。我使用 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
但在 Linux Ubuntu 14.04 上,Java 1.7.0_79(64 位)和 Java 1.8.0_60(64 位)上的相同代码使路径未标准化:
/
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 路径的任何替代方法(无需手动进行所有解析)。
【问题讨论】:
-
反之亦然:
WindowsFileSystem默默地将/视为分隔符,尽管没有指定这种行为,这可以被认为是一个错误。或便利功能,无论您喜欢哪种方式。不幸的是,这种行为导致开发人员期望从实现中获得魔力…… -
如果你在路径元素
Path path = Paths.get("..", "dir1", "dir2", "file1").toAbsolutePath().normalize();上构造Path,你可以避免这样的问题,你不需要自己处理File.separator。
标签: java linux windows path java-7