【发布时间】:2019-07-06 07:22:50
【问题描述】:
我创建了一个项目,它在执行时使用图像文件和文本文件。在我将项目导出到可运行的 jar 之前,文本和图像文件都在我的项目文件夹中,但是当我从命令行运行 jar 时,由于程序键入从文本文件中读取而导致出现 filenotfound 异常。我解压缩 jar 以仔细检查,图像和文本文件不存在。
package application;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import javafx.collections.FXCollections;
public class Data {
private static Data instance=new Data();
private Map<String,String> saveEntries = new HashMap<>();
private static String fileName = "ResponseData";
public static Data getInstance() {
return instance;
}
public void exitSave() throws IOException {
Path path = Paths.get("ResponseData");
Iterator<Map.Entry<String, String>> iter = saveEntries.entrySet().iterator();
BufferedWriter bw = Files.newBufferedWriter(path);
try {
while(iter.hasNext()) {
Map.Entry<String, String> entry = iter.next();
bw.write(String.format("%s\t%s", entry.getKey(),entry.getValue()));
bw.newLine();
}
} catch (IOException e) {
new FileNotFoundException("Error when saving data");
}finally {
if(bw!=null)
bw.close();
}
}
public void updatedSaveEntry(String input, String response) {
saveEntries.put(input, response);
}
public Map<String,String> getSaveEntries(){
return this.saveEntries;
}
public void setEntry(Map<String,String> map) {
Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry<String, String> entry = iter.next();
saveEntries.put(entry.getKey(), entry.getValue());
}
}
public void loadEntries() throws IOException{
saveEntries = FXCollections.observableHashMap();
Path path = Paths.get(fileName);
BufferedReader br = Files.newBufferedReader(path);
String line;
try {
while((line=br.readLine())!=null&&!line.trim().isEmpty()) {
String[] parts = line.split("\t");
saveEntries.put(parts[0], parts[1]);
}
}finally {
if(br!=null) {
br.close();
}
}
}
}
【问题讨论】:
-
那么我们怎么知道你为什么没有把丢失的文件打包到jar中呢?你没有提供任何细节,你甚至没有问一个真正的问题。你只是在描述一个事实。
-
让我修改一下我的陈述。基本上,我创建了一个类似的项目,之前包含一个文本文件并将项目导出到一个 jar 中。该程序从文本文件中保存和检索文本没有问题,因此我假设该文件也包含在 jar 文件中(如果我错了,请原谅,我对 IO 不太熟悉)。我创建的这个新项目也使用了 javafx,但主要区别在于我将 JDK 和 JavaFX 更新到了最新版本。由于 JavaFX 问题,我还在运行配置中添加了一个 VM 参数(openjfx.io/openjfx-docs/#install-javafx)
-
VM 参数:--module-path "\path\to\javafx-sdk-12.0.1\lib" --add-modules javafx.controls,javafx.fxml ,除了这些变化我的两个项目的文件 IO 代码几乎相同,但是当我尝试运行 jar 时,我当前的项目给了我 filenotfound 错误。
-
你仍然没有抓住重点。 1. 文本文件是否应该在 jar 文件中取决于您在代码中访问文件的方式,但您没有提供任何相关信息。 2.您一直在谈论将某些内容导出到 jar 文件,但您没有提供任何信息,您是如何做到的。手动?通过 Eclipse?通过一些 Maven/Gradle 插件或什么?如果要将文本文件导出到 jar 中,则必须正确配置导出。例如,如果您使用的是 Maven/Gradle,则该文件必须位于正确的资源文件夹中。
-
哦,好的。我为我的文件访问类添加了代码。错误显示在 'Path path = Paths.get("ResponseData");'其中“ResponseData”是我项目中的文件。我通过 Eclipse 导出了我的项目(底部的屏幕截图链接)。
标签: java eclipse javafx jar export