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

rai*_*ner 0 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
Run Code Online (Sandbox Code Playgroud)

fas*_*seg 7

异常根本原因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")));
Run Code Online (Sandbox Code Playgroud)

这很可能是classes目录。如果您想例如点classessrc文件夹,您可以使用以下路径:

Paths.get("../src/javafxapplication/Target.fxml")
Run Code Online (Sandbox Code Playgroud)

然而,这是不好的做法,因为该src文件夹通常不是您的分发包的一部分。您可能应该将 复制Target.fxml到另一个位置或使用构建工具(如 Apache Maven)创建一个 jar 文件,该文件包含Target.fxml并使用 .jar 文件从 jar 文件中读取内容ClassLoader.getResource()


rai*_*ner 5

最终它成功了,感谢 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));
Run Code Online (Sandbox Code Playgroud)