从jar动态加载文件



我正在尝试读取。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()的结果。

相关内容

  • 没有找到相关文章