2011-09-02 70 views
3

過去2個小時一直在尋找這個東西,找不到任何東西(我找到了解決同樣問題的解決方案,但使用圖片而不是文本文件)。當我JAR程序時,Java將資源文件放在哪裏?

非常多,我做了一個讀取文本文件的程序。該文件是名稱和ID的列表。使用Eclipse,我把文件放在我的src文件夾中,並在程序中放入路徑文件。就像這樣:

in = new BufferedReader(new FileReader(curDir+"\\bin\\items.txt")); 

哪裏CURDIR是用戶的當前目錄(用System.getProperty( 「user.dir來」)中找到)。

現在,問題是,當我從Eclipse運行程序時,程序運行良好,但是當我試圖將其設置爲可運行JAR並運行它時,程序將運行,但文本文件中的信息不會加載。它看起來像Eclipse沒有把文本文件放入JAR中。

編輯:解決這個問題?所以JAR文件需要在一個包含所有原始文件的文件夾中?我很困惑,那麼什麼是JAR文件?

+0

一個jar文件基本上包含所有子目錄和文件的目錄。它也經常被壓縮以佔用更少的空間。您可以使用命令行'jar -tf myfile.jar'來查看jar文件的內容。或者在NetBeans中,如果我去了我的項目「文件」,我可以點擊生成jar文件,並查看其內容。在Eclipse中必須有相同的東西。 – toto2

+0

其實我忘了最重要的部分:你可以把任何目錄和文件在一個罐子裏,但平時的罐子的用於運行代碼('Java的罐子myJar.jar')包含可執行的類和資源文件。一個jar也可以包含其他的jar文件,當你的程序需要一些包裝在jar中的庫的時候這很有用。 – toto2

回答

2

更加可靠的方式來獲得文件無論您是從Eclipse中運行或JAR是做

MyClass.getResource("items.txt") 

其中MyClass是在同一包(文件夾),因爲你需要的資源類。

如果Eclipse沒有把你的JAR文件,你可以去

運行 - >運行配置 - > - > Classpath選項卡 - >高級 - >添加文件夾

然後添加包含文件夾文件到類路徑。或者,導出Ant腳本並創建一個自定義構建腳本。

1

至此,FileReader只能讀取磁盤文件系統資源。但是JAR僅包含類路徑資源。您需要將其作爲類路徑資源來讀取。你需要這個ClassLoader

假設Foo是你在需要讀取資源和items.txt被放在JAR的類路徑根JAR類,那麼你應該如下閱讀(注:需要前導斜槓):

InputStream input = Foo.class.getResourceAsStream("/items.txt"); 
reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); 
// ... 

或者,如果您希望獨立於類或運行時上下文,請使用相對於類路徑根運行的上下文類加載器(注意:不需要前導斜槓!):

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream input = classLoader.getResourceAsStream("items.txt"); 
reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); 
// ... 

(UTF-8是當然的文件進行編碼的字符集,否則你可能會看到Mojibake

0

讓您的jar文件的位置

首先創建一個文件夾(說我的文件夾),並把你的文件裏面

考慮以下功能

public String path(String filename) 
{ 
URL url1 = getClass().getResource(""); 
String ur=url1.toString(); 
ur=ur.substring(9); 
String truepath[]=ur.split("myjar.jar!"); 
truepath[0]=truepath[0]+"myfolder/"; 
truepath[0]=truepath[0].replaceAll("%20"," "); 
return truepath[0]+filename; 
}//This method will work on Windows and Linux as well. 
//You can alternatively use the following line to get the path of your jar file 
//classname.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 

假設你的jar文件是在d:\測試\ DIST

然後路徑()將返回/ d:/測試/距離/ MyFolder文件/文件名

現在,你可以把 'MyFolder文件' 內其中,如果你想訪問你的一些jar文件駐留

OR

文件夾只讀文件JAR文件中,你應該把它複製到一個

你的軟件包,並可以訪問它作爲

yourClassname.getResource( 「/包/ FILENAME.TXT」);

相關問題