无论操作系统如何在Java中获取干净的绝对文件路径?

Act*_*ine 22 java path filepath

这是问题所在.经过一些连接,我可能碰巧有这样的字符串

"C:/shared_resources/samples\\import_packages\\catalog.zip"
Run Code Online (Sandbox Code Playgroud)

甚至这个

"C:/shared_resources/samples/subfolder/..\\import_packages\\catalog.zip"
Run Code Online (Sandbox Code Playgroud)

我想要一些代码将这种字符串转换为具有统一分隔符的路径.

想到的第一个解决方案是使用new File(srcPath).getCanonicalPath(),但这里是棘手的部分.此方法依赖于调用测试的系统.但是我需要将字符串传递给远程计算机(带有浏览器的Selenium Grid节点),这里和那里的系统分别是Linux和Windows.因此,尝试做new File("C:/shared_resources/samples\\import_packages\\catalog.zip").getCanonicalPath()类似的结果"/home/username/ourproject/C:/shared_resources/samples/import_packages/catalog.zip".使用钝性正则表达式替换似乎也不是一个非常好的解决方案.

有没有办法修剪路径并使分隔符统一(并且可能解决..它)而不试图隐含地绝对化它?

Dra*_*ski 25

试试这个:

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("myFile.txt");
        Path absolutePath = path.toAbsolutePath();

        System.out.println(absolutePath.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这留下一个`.`:`.`得到`D:\ git-repositories\winery\winery\.`而不是`D:\ git-repositories\winery\winery`.最后添加`normalize()`也会删除最终的`.`. (3认同)
  • toAbsolutePath() 不会消除冗余的相关部分。 (2认同)

sti*_*ppi 5

您可以使用:

Path absolutePath = path.toAbsolutePath().normalize();
Run Code Online (Sandbox Code Playgroud)

...至少消除冗余的相关部分。正如规范化()的文档提到的,如果路径的消除节点实际上是链接,则解析的文件可能会不同,或者不再可解析。


Hyd*_*oid -4

例如,这是您的路径:

String jarName = "C:/shared_resources/samples\\import_packages\\catalog.zip"
jarName.replaceAll("/", "\\");
jarName.replaceAll("..", "/");
Run Code Online (Sandbox Code Playgroud)