2016-01-21 55 views
0

我需要使用URL訪問當前執行的.jar中的文件。無法通過URL訪問.jar中的文件

URL url = BlockConverter.class.getResource("/test.txt"); 
System.out.println(url.toString()); 
InputStream is = url.openStream(); 

這就是我所做的。 輸出是:

jar:file:/C:/Users/User/Desktop/SERVER/plugins/MyJar.jar!/test.txt 

我的InputStream最終總是拋出一個IOException異常被初始化的時候,即使URL被正確輸出。 那怎麼可能? 爲什麼我無法打開流?

編輯: 另外,請不要用「使用的getResourceAsStream」的答案,因爲它使用相同類型的代碼:

public InputStream getResourceAsStream(String name) { 
    URL url = getResource(name); 
    try { 
     return url != null ? url.openStream() : null; 
    } catch (IOException e) { 
     return null; 
    } 
} 
+0

什麼來自IOException的消息?對於這個問題,你的jar的根目錄下是否有test.txt? – Powerlord

+0

恩,非常感謝。在對代碼進行一些更改後,我沒有讀取堆棧跟蹤,結果證明文件名中的無效字符導致了IOException,而不是流。我非常感謝這個想法,我現在會去慚愧地哭泣。 –

+0

當我說你不是第一個錯過堆棧跟蹤消息的人時,請相信我。不是由一個長鏡頭。 :P – Powerlord

回答

1

我會打開它作爲流直接例如

InputStream is = BlockConverter.class.getResourceAsStream("/test.txt"); 

,上面的方法,我通常一個罐子內訪問資源的方式(它會不管它被包裝罐子內打開資源,或簡稱爲包裝的部署,注)

+0

我試過了,但是結果是一樣的。除此之外,我需要記錄URL,所以這看起來像是更乾淨的解決方案。 –

+0

另請注意,getResourceAsStream()在其源代碼中使用url.openStream(),所以它沒有區別。 –

+0

test.txt與BlockConverter的關係在哪裏?以上建議它應該在jar文件的根目錄下。如果你得到一個空流,我認爲你的jar打包或對實體的引用是錯誤的 –