Java isAbsolute()如何依赖于路径分隔符和/或操作系统?

ercv8c1e  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(271)

我正在尝试纠正一些用Java编写的代码。向后斜杠和向前斜杠在isAbsolute()函数中的行为不同。

Path ESPath = Paths.get("\\es-module-repo\\fdea3319-18ea-4bd5-8ae2-2662d6f2ba72\\foo.mjs");
if (ESPath.isAbsolute()) { ... }
Path ESPath2 = Paths.get("/es-module-repo/fdea3319-18ea-4bd5-8ae2-2662d6f2ba72/foo.mjs");
if (ESPath2.isAbsolute()) { ... }

但是这取决于Java运行的操作系统吗?This code显示了差异。是哪条路(哪一条?)实际上是绝对的还是不是?那么,将反斜杠(实际上是双反斜杠)转换为正斜杠的最安全的方法是什么?这样做对吗?
编辑:我在一台Windows机器上工作,有第一种情况,它返回false

efzxgjgh

efzxgjgh1#

我启动了一个调试过程,并使用 * ForceStepInto * 命令来导出不等式。
第一个路径 ESPath 使用 UnixPath#isAbsolute 方法。
这是在第二个条件下产生一个 false
然而,* ESPath 2 * 对两者都产生 true

@Override
public boolean isAbsolute() {
    return (path.length > 0 && path[0] == '/');
}

此外,* Paths * JavaDoc具有以下 @apiNote 建议。

/**
 * @apiNote
 * It is recommended to obtain a {@code Path} via the {@code Path.of} methods
 * instead of via the {@code get} methods defined in this class as this class
 * may be deprecated in a future release.
 */
vybvopom

vybvopom2#

Windows上的Java识别斜线/和反斜线\作为文件分隔符,所以你会发现在Windows上ESPath.equals(ESPath2)true,因为它们包含相同的相对路径,并且它们都有3个组件-参见ESPath.getNameCount()
参见@ThomasKläger的评论。Windows将报告ESPath/ESPath2.isAbsolute()为false,因为没有驱动器号。当你调用ESPath.toAbsolutePath()时,Windows将返回绝对路径,并以你启动JVM时应用的当前驱动器号作为你的路径前缀,因此如果你运行以下命令,它将解析到不同的位置:

cd /d c:\SomeDir
java YourApp

cd /d d:\AnotherDir
java YourApp

您的“This code”链接显示了GNU/Linux的处理方式,与Windows不同,因为它只识别斜杠/作为路径分隔符,并将反斜杠\视为文件名的另一个字符。尝试:

touch a\\b\\c
=> creates a file called a\b\c in current directory

因此,你会发现ESPath.equals(ESPath2)falseESPath.isAbsolute()false,因为ESPath.getNameCount()只显示一个路径分量,而ESPath2.getNameCount()是3,ESPath2.isAbsolute()true,因为路径以/开始。

相关问题