我正在尝试读取。json文件,我正在打包我的。jar。
问题-找到文件以便在。
中解析它奇怪的是,这段代码在NetBeans中工作,可能是由于这些方法的工作方式和NetBeans处理开发工作空间的方式。然而,当我构建jar并运行它时,它抛出了一个丑陋的错误:Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical
.
//get json file
File jsonFile = new File(AndensMountain.class.getResource("/Anden.json").toURI());
FileReader jsonFileReader;
jsonFileReader = new FileReader(jsonFile);
//load json file
String json = "";
BufferedReader br = new BufferedReader(jsonFileReader);
while (br.ready()) {
json += br.readLine() + "n";
}
如果我允许它从与jar相同的目录中读取,我已经让它工作了,但这不是我想要的- .json在jar中,我想从jar中读取它。
我已经环顾四周,据我所见,这应该是工作的,但它不是。
如果您感兴趣,这是在尝试从jar中读取它之前的代码(只要Anden。json与andensmount .jar在同一个目录下):
//get json file
String path = AndensMountain.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();
File jsonFileBuilt = new File(new File(path).getParentFile(), "Anden.json");
File jsonFileDev = new File(new File(path), "Anden.json");
FileReader jsonFileReader;
try {
jsonFileReader = new FileReader(jsonFileBuilt);
} catch (FileNotFoundException e) {
jsonFileReader = new FileReader(jsonFileDev);
}
Try
Reader reader = new InputStreamReader(AndensMountain.class.getResourceAsStream("/Anden.json"), "UTF-8");
AndensMountain.class.getResource("/Anden.json")
URL在jar外运行时(例如,当类被编译到"classes/"目录时)是一个"file://" URL。
当从jar中运行时,情况不是这样:它会变成"jar://" URL。
java.io.File
不知道如何处理这种类型的URL。它只处理"file://"。
无论如何,你并不需要把它当作一个文件。您可以操作URL本身(例如,导航到父目录)或获取其内容(通过openStream()
,或者如果需要添加标题,通过openConnection()
)。
java.lang.Class#getResourceAsStream()
正如我所建议的,只是Class#getResource()
的简写,然后是openStream()
的结果。