Java Paths.get .... readAllBytes(path)) 不适用于相对路径
Java Paths.get .... readAllBytes(path)) not working with 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
异常根本原因 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
复制到另一个位置或使用 Apache Maven 等构建工具创建一个包含 Target.fxml
的 jar 文件,并使用 ClassLoader.getResource()
.
从 jar 文件中读取内容
终于让它工作了,感谢 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));
我是 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
异常根本原因 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
复制到另一个位置或使用 Apache Maven 等构建工具创建一个包含 Target.fxml
的 jar 文件,并使用 ClassLoader.getResource()
.
终于让它工作了,感谢 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));