2012-07-16 46 views
0

我正在爲某些串行端口通信創建Java應用程序,並且在應用程序的文件夾中有兩個資源需要在運行時存在。第一種是用作啓動畫面的圖像,另一種是在程序啓動時需要讀取的配置文件。在JAR中引用文件

下面是從Linux中的「樹」命令輸出的一個刪節的版本,這兩個文件,我需要被引用爲「commandSet.config」和「飛濺screen2.png」

. 
├── bin 
│   ├──... 
├── commandSet.config 
├── app-manifest.txt 
├── splash-screen2.png 
└── src 
    ├── events 
    │   └── InterfaceEvents.java 
    ├── models 
    │   ├── Command.java 
    │   └── Phone.java 
    ├── operations 
    │   ├── Application.java 
    │   ├── ... 
    └── views 
     ├── CallDialog.java 
     ├── SplashScreen.java 
     └── Window.java 

我目前引用了下面幾行:

BufferedReader in = new BufferedReader(new FileReader("commandSet.config")); 

JLabel image = new JLabel(new ImageIcon("splash-screen2.png")); 

該W當我從Eclipse運行它時運行得很好,但是一旦我導出到可運行JAR文件就不會被移動,因此沒有被正確地引用。我試圖將它們移動到「src」文件夾中,導致它們被存檔在JAR中,但我仍然無法引用它們。

我對導出Java項目的概念很陌生,所以也許我錯過了一些明顯的東西。如果有人能夠告訴我做到這一點的最佳方式以及未來項目文件系統的最佳方法,我將非常感激。乾杯!

回答

0

好吧,我一心想要解決這個問題,並認爲我會在未來爲其他人解答。我基本上遵循「duffymo的」指導方針,這是我做的:

  • 在創造了我的資源JAR
  • 把該JAR在根項目
  • 用Eclipse將JAR添加到構建路徑。
  • 使用getResourceAsStream(「/nameOfFile.ext」)來獲取我的資源的流。

乾杯!

1

無法以與在文件系統中相同的方式訪問該文件。

從您的上下文中使用getResourceAsStream()使用類加載器從CLASSPATH中讀取它。

+0

好的,應該在哪裏存儲文件以便以這種方式引用它們? – 2012-07-16 12:13:50

+0

當然,在部署應用程序的JAR或WAR中。由於類加載器在CLASSPATH中查找,因此您需要將它們放在CLASSPATH中。在你的JAR中,這是在清單類路徑中。在WAR中,這是WEB-INF/classes文件夾 – duffymo 2012-07-16 12:24:11

+0

好的,僅供參考,我只使用JAR。我不完全確定你的意思,「你需要他們在CLASSPATH」?我有一個清單文件,其中包含以下內容: Main-Class:operations.Application – 2012-07-16 13:39:51

3
InputStream in = this.getClass().getClassLoader().getResourceAsStream("splash-screen2.png"); 
byte[] buffer = new byte[in.available()]; 
in.read(buffer); 
ImageIcon icon = new ImageIcon(buffer); 
+0

這將返回一個inputStream,但對嗎? ImageIcon沒有構造函數重載,它接受一個inputStream對象作爲參數。 – 2012-07-16 12:13:22

+1

您需要將InputStream的內容加載到byte []數組中並使用該構造函數。 – 2012-07-16 12:20:44

+0

答案已更新 – Ilya 2012-07-16 12:22:20