从jar动态加载文件

时间:2014-07-08 03:01:10

标签: java json netbeans 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中读取它。 / p>

我环顾四周,据我所知,这应该有用,但不是。

如果您感兴趣,这是在尝试将其读出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);
    }

1 个答案:

答案 0 :(得分:2)

尝试

Reader reader = new InputStreamReader(AndensMountain.class.getResourceAsStream("/Anden.json"), "UTF-8");

AndensMountain.class.getResource("/Anden.json")在jar外部运行时的URL(例如,当类被编译为“classes /”目录时)是“file://”URL。

从jar中运行时不是这种情况:然后它变成了“jar://”URL。

java.io.File不知道如何处理这种类型的网址。它只处理“file://”。

无论如何,你真的不需要把它当作文件来对待。您可以操纵URL本身(例如,导航到父目录)或获取其内容(通过openStream(),或者如果您需要通过openConnection()添加标题)。

我建议的

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