我正在尝试纠正一些用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
。
2条答案
按热度按时间efzxgjgh1#
我启动了一个调试过程,并使用 * ForceStepInto * 命令来导出不等式。
第一个路径 ESPath 使用 UnixPath#isAbsolute 方法。
这是在第二个条件下产生一个 false。
然而,* ESPath 2 * 对两者都产生 true。
此外,* Paths * JavaDoc具有以下 @apiNote 建议。
vybvopom2#
Windows上的Java识别斜线
/
和反斜线\
作为文件分隔符,所以你会发现在Windows上ESPath.equals(ESPath2)
是true
,因为它们包含相同的相对路径,并且它们都有3个组件-参见ESPath.getNameCount()
。参见@ThomasKläger的评论。Windows将报告
ESPath/ESPath2.isAbsolute()
为false,因为没有驱动器号。当你调用ESPath.toAbsolutePath()
时,Windows将返回绝对路径,并以你启动JVM时应用的当前驱动器号作为你的路径前缀,因此如果你运行以下命令,它将解析到不同的位置:您的“This code”链接显示了GNU/Linux的处理方式,与Windows不同,因为它只识别斜杠
/
作为路径分隔符,并将反斜杠\
视为文件名的另一个字符。尝试:因此,你会发现
ESPath.equals(ESPath2)
是false
,ESPath.isAbsolute()
是false
,因为ESPath.getNameCount()
只显示一个路径分量,而ESPath2.getNameCount()
是3,ESPath2.isAbsolute()
是true
,因为路径以/
开始。