簡體   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