2012-03-23 96 views
2

我有一個文件保存用於加載我的應用程序的textField的默認信息。我在編譯時查找了如何將這些內置到我的jar文件中,並且我被告知將它放在源代碼包中,它將被帶入,所以我已經完成了。文件路徑在NetBeans中工作,但不在構建的JAR文件中

文件結構:

Project 
    -Source Packages 
     -src 
      ~Java Classes 
     -defaultFiles 
      ~Defaults.txt 

我想使用的代碼是這樣的:

BufferedReader in; 
try { 
    URL resourceURL = FuelProperties.class.getResource("/defaultFiles/Defaults.txt"); 
    in = new BufferedReader(new FileReader(resourceURL.getPath())); 
} 

這完美的作品,當我運行它通過NetBeans的,但是當我生成項目,並嘗試從jar文件運行它不抓取文件。

我已驗證默認文件正在構建並存在於上述相同的文件結構中。

如果你能幫助我解決這個問題,我將非常感激,因爲我不知道是什麼讓它不能工作。謝謝。

+0

我猜測/ src/defaultFiles實際上在你的jar中? – gorjusborg 2012-03-23 15:28:41

+0

這就是我所相信的,正如在我的dist文件夾中(這是程序構建的地方),只有jar文件和lib文件夾。 lib文件夾只包含庫罐。 – Alex 2012-03-23 15:30:34

+1

那麼,沒有理由不檢查jar來查看文件是否確實在那裏:)只需使用jar xvf .jar將其全部轉存。但是正如Dennis R.所說的那樣,你不能通過這種方式在jar文件中加載文件。您需要使用包含jar的類加載器的getResource方法之一。 – gorjusborg 2012-03-23 15:36:11

回答

1

我在搜索幾十個問題後找到答案。事實證明,你只能得到你的JAR文件中的數據的InputStream而不是像我試圖做的那樣的File對象。 (如果你想File對象,你只需要提取程序從JAR文件,然後您可以訪問它。)

這樣得到了我的問題的工作代碼被簡單地更換這樣的:

URL resourceURL = FuelProperties.class.getResource("/defaultFiles/Defaults.txt"); 
in = new BufferedReader(new FileReader(resourceURL.getPath())); 

有了這個:

in = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/defaultFiles/Defaults.txt"))); 

而現在,它正在內外NetBeans和在建的JAR文件。

+0

好吧,我認爲你的問題發生在getResource返回null ... – 2012-03-27 06:50:14

+0

我認爲它是有道理的,要試試這個,即時通訊使用文件和在罐子裏我接受NPE,所以我會改變它getResourceAsStream,謝謝。 – 2017-08-07 15:24:11

4

您必須在類路徑中查找,而不是在磁盤上查找。 使用的API是:

URL resourceURL : this.getClass().getResource("relative path in the classpath"); 

一旦你有,你可以打開一個流的URL等

編輯:在main方法,你當然需要更換

this.getClass() 

作者:

ClassName.class 
+1

getResourceAsStream(String path)也可以非常方便,因爲它直接返回輸入流。 – gorjusborg 2012-03-23 15:37:21

+0

事實上,這是一次性的:可以根據是否需要多次讀取資源來完成選擇。 – 2012-03-23 16:21:29

+0

@DenisR。我嘗試過使用你的方法,並且我再一次在NetBeans中工作,但是當我構建並運行jar時,它仍然沒有加載文件。我使用了Pleepleus的建議,並檢查了jar以確保文件在那裏,所以我不確定這裏沒有什麼工作。 :/ – Alex 2012-03-26 12:44:41