如何解决为什么Path.relativize在Java 8和Java 11上的行为不同?
为什么方法relativize
在java-8和java-11上的行为不同?
Path path1 = Paths.get("/a/./b/../image.png");
Path path2 = Paths.get("/a/file.txt");
Path path = path1.relativize(path2);
System.out.println(path);
两个版本的JavaDoc描述相同。我觉得java-11的方式对我来说似乎是正确的行为:
-
path1
:/a/./b/../image.png
归一化为/a/b/../image.png
,归一化为/a/image.png
-
path2
:/a/file.txt
从
/a/image.png
和/a/file.txt
导航 的方法是../file.txt
问题
-
应该如何计算java-8的方式?它不规范路径吗?我不明白如何从头部得到结果 。
-
为什么这两个版本之间根本没有记录?
解决方法
也许此错误会回答您的问题: https://bugs.openjdk.java.net/browse/JDK-8066943
这影响了包含的相对论路径。或..并已针对Java 9修复。 这就是为什么您看到8和11之间存在差异的原因。
,此处是基于Windows的源代码。
从对源代码的观察(让我们看一下sun.nio.fs.WindowsPath
,Path
的一种实现)来看,java-11中包含了其他代码,包括归一化与java-8相比。
-
GitHub上的
- java-8
sun.nio.fs.WindowsPath
源代码
GitHub上的 - java-11
sun.nio.fs.WindowsPath
源代码
后一种实现的关键行始于第411行,因此,基本上,后一种实现在对相对路径进行计算之前,先对路径进行归一化:>
WindowsPath base = this;
if (base.hasDotOrDotDot() || child.hasDotOrDotDot()) {
base = base.normalize();
child = child.normalize();
}
进一步挖掘,实现在jdk8-b120
(源)和jdk-9+95
(源)之间变化。自从引入模块化系统以来,两者的类实现和位置都不同:
- Java 8及以下版本:
/jdk/src/windows/classes/sun/nio/fs/WindowsPath.java
- Java 9及更高版本:
/jdk/src/java.base/windows/classes/sun/nio/fs/WindowsPath.java
应该如何计算java-8的方式?它不规范路径吗?我不明白如何从头部得到结果 。
最直接的方法是先使两个路径归一化,然后再相对化它们。但是我不知道它是否完全涵盖了所有java.nio.file.Path
实现,并且这样做是安全的。
Path path = path1.normalize().relativize(path2.normalize());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。