繁体   English   中英

从jar动态加载文件

[英]Load file dynamically from jar

我正在尝试读取与.jar打包在一起的.json文件。

问题-找到文件以便我可以解析它。

奇怪的是,此代码可在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与AndensMountain.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);
    }

尝试

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()内容(通过openStream() ,或者如果您需要通过openConnection()添加标头)。

我建议的java.lang.Class#getResourceAsStream()只是Class#getResource()简写,其后是openStream()的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM