2011-03-02 85 views
8

我需要能夠訪問存儲在編譯的jar文件中的文件。我已經想出瞭如何將文件添加到項目中,但是如何在代碼中引用它?我該如何將文件從jar文件複製到用戶硬盤上的某個位置?我知道有幾十種方法可以訪問文件(FileInputStream,FileReader等),但我不知道如何查看內部。訪問jar文件中的文件?

回答

17

你可以使用這樣的事情:

InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileFromJarFile);

如果foo.txt的是你的JAR文件的根目錄,你會使用:

InputStream is = this.getClass().getClassLoader().getResourceAsStream("foo.txt");

假設類與資源在相同的JAR文件中,我相信。

+0

我需要的部分是需要FileReader作爲輸入的BufferedReader。我如何將InputStream轉換爲FileReader? – LRFLEW 2011-03-02 20:53:14

+0

您只需使用Java文檔連接點即可。看看BufferedReader - 在See Also部分,有FileReader和InputStreamReader。轉到InputStreamReader等。 – 2011-03-02 21:02:49

+0

是的,我可以做到這一點,但我只是查找了BufferedReader,並發現了我需要使用的parter類BufferInputStream:P。 – LRFLEW 2011-03-02 21:43:39

1

看看JarFile類。您需要獲取jar文件中特定條目的InputStream的所有內容。

4

您可以使用getResource()來獲取類路徑上的文件的URL,或者使用getResourceAsStream()來獲取InputStream。

例如:

BufferedReader reader = new BufferedReader(new InputStreamReader(
    this.getClass().getResourceAsStream("foo.txt"))); 
4

您可以使用JarFile類閱讀JAR文件的內容。

這裏有一個如何,你可以從一個JAR文件中獲得一個特定的文件,並提取它的一個例子:

JarFile jar = new JarFile("foo.jar"); 
String file = "file.txt"; 
JarEntry entry = jar.getEntry(file); 
InputStream input = jar.getInputStream(entry); 
OutputStream output = new FileOutputStream(file); 
try { 
    byte[] buffer = new byte[input.available()]; 
    for (int i = 0; i != -1; i = input.read(buffer)) { 
     output.write(buffer, 0, i); 
    } 
} finally { 
    jar.close(); 
    input.close(); 
    output.close(); 
} 
0

只是想補充一點,如果我們想訪問內位於以下路徑Jar文件:

Windows: 
c:\your-jar-file.jar\dir1\dir2\dir3\foo.txt 

Linux: 
/home/your-jar-file.jar/dir1/dir2/dir3/foo.txt 

將需要使用下面的代碼(注意,有NO在路徑的開始「/」(正斜槓)字符):

InputStream is = this.getClass().getClassLoader().getResourceAsStream("dir1/dir2/dir3/foo.txt");