Java Paths.get .... readAllBytes(path))不使用相对路径

时间:2016-12-22 03:18:11

标签: java javafx relative-path

我是Java新手并尝试构建FX应用程序。我的一个功能旨在用其他字符串替换某些字符串。只要我定义目标文件的绝对路径,脚本就可以正常工作,但是当我使用相对路径时,脚本会中断。

问题在于方法“readAllBytes”,它只适用于完整路径。但我需要相对路径,因为文件夹位置会有所不同。

目标文件位于项目文件夹中。有没有其他方法可以用来读取文件内容,这不需要绝对路径?

提前多多感谢。以下是摘录:

    if (checkbox.isSelected()) {
        //this works .....
        Path path = Paths.get("//home/../../../../Target.fxml")
        Charset charset = StandardCharsets.UTF_8; 
        String content = new String(Files.readAllBytes(path));
        content = content.replaceAll("text_old" , "text_new");
        Files.write(path, content.getBytes(charset));

        //this doesn't work...
        Path path = Paths.get("Target.fxml");


Caused by: java.nio.file.NoSuchFileException: Target.fxml

2 个答案:

答案 0 :(得分:3)

异常根本原因java.nio.file.NoSuchFileException: Target.fxml确实意味着该文件在给定位置不存在。

如果您正在执行Paths.get("Target.fxml"),那么您正在查找文件Target.fxml的当前工作目录。但由于该文件位于src/javafxapplication/Target.fxml,并且该程序是从另一个目录Target.fxml运行的,因此无法找到。

您可以使用例如:

检查应用程序的工作目录
System.out.println(System.getProperty("user.dir")));

这可能是classes目录。如果你想要,例如从classes指向src文件夹,您可以使用以下路径:

Paths.get("../src/javafxapplication/Target.fxml")

这是不好的做法,因为src文件夹通常不属于您的分发包。您应该将Target.fxml复制到其他位置或使用Build Tools之类的Apache Maven创建一个包含Target.fxml的jar文件,并使用ClassLoader.getResource()从jar文件中读取内容。

答案 1 :(得分:1)

毕竟让它工作了,感谢Fasseg和其他人找到时间和耐心来研究这个问题。这是最终的代码:

        Path path = Paths.get("src/javafxapplication2/PopupFXML.fxml");
        Charset charset = StandardCharsets.UTF_8;
        String content = new String(Files.readAllBytes(path));
        content = content.replaceAll("old_text" , "new_text");
        Files.write(path, content.getBytes(charset));