2015-06-21 90 views
1

我得到了一個jar文件test.jar,它包含一個包含txtFile.txt的文件夾資源。從jar裏面訪問資源

我試圖訪問該文件,但該文件似乎爲空。

package main; 

import java.net.URL; 

public class Test { 

    private Test() { 
     URL file = this.getClass().getClassLoader().getResource("/resources/txtFile.txt"); 
     System.out.println(file == null); 
    } 

    public static final void main(String[] args) { 
     new Test(); 
    } 
} 
+0

如果你解壓縮jar文件,你會看到該文件嗎? – roby

+0

是的,該文件是在資源文件夾內的瓶子 – durchstarter

+0

資源或資源?你的代碼段說資源 – roby

回答

1

嘗試使用getResource("resources/txtFile.txt");(即沒有第一/)。

當使用ClassLoader的版本getResource時,不應該有一個前導斜槓,它將被永遠解釋爲絕對路徑。

+0

這是因爲當您使用'Class.getResource'時,您使用'/'來指示路徑是絕對路徑,而不是相對路徑去上課。在委託給類加載器之前,它會剝離前導'/'。 – roby

+0

@roby我看,謝謝你的信息。有趣的是,我最初聯繫的最高回答得到了這個部分錯誤。我已經從我的答案中刪除了這部分,並提供了它的本質。 –

0

如果您正在使用maven,src/main/resourcessrc/test/resources是txtFile.txt有在兩者中任選一種,你並不需要在路徑resources/。您可以使用此insstead

this.getClass().getClassLoader().getResource("/txtFile.txt");

+0

我試過了,它沒有幫助。 – durchstarter

0

而不是使用流作爲文件的,你可以用以下的InputStream的要求:

InputStream in = getClass().getResourceAsStream("/txtFile.txt"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
+0

我試過了,它沒有幫助。 – durchstarter

0

您不必指定資源文件夾。您可以直接用戶文件名

getClass().getResourceAsStream("txtFile.txt"); 
+0

我試過了,它沒有幫助。 – durchstarter

+0

嗯。可以嘗試將它放入包中並使用包名稱調用 –

+0

也沒有幫助 – durchstarter

0

所以我做了這個

package main; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 

public class Test { 

    private Test() { 
     Class<?> c = this.getClass(); 
     ClassLoader cl = c.getClassLoader(); 
     InputStream[] iss = new InputStream[8]; 
     URL[] urls = new URL[8]; 
     iss[0] = c.getResourceAsStream("/resources/txtFile.txt"); 
     iss[1] = c.getResourceAsStream("resources/txtFile.txt"); 
     iss[2] = c.getResourceAsStream("/txtFile.txt"); 
     iss[3] = c.getResourceAsStream("txtFile.txt"); 
     iss[4] = cl.getResourceAsStream("/resources/txtFile.txt"); 
     iss[5] = cl.getResourceAsStream("resources/txtFile.txt"); 
     iss[6] = cl.getResourceAsStream("/txtFile.txt"); 
     iss[7] = cl.getResourceAsStream("txtFile.txt"); 
     urls[0] = c.getResource("/resources/txtFile.txt"); 
     urls[1] = c.getResource("resources/txtFile.txt"); 
     urls[2] = c.getResource("/txtFile.txt"); 
     urls[3] = c.getResource("txtFile.txt"); 
     urls[4] = cl.getResource("/resources/txtFile.txt"); 
     urls[5] = cl.getResource("resources/txtFile.txt"); 
     urls[6] = cl.getResource("/txtFile.txt"); 
     urls[7] = cl.getResource("txtFile.txt"); 
     for (int i = 0; i < 8; i++) 
      System.out.println("iss[" + i + "] is " 
        + String.valueOf(iss[i] == null)); 
     for (int i = 0; i < 8; i++) 
      System.out.println("url[" + i + "] is " 
        + String.valueOf(urls[i] == null)); 
     int read; 
     try { 
      while ((read = iss[0].read()) != -1) 
       System.out.print((char) read); 
     } catch (IOException e) { 
     } 

    } 

    public static final void main(String[] args) { 
     new Test(); 
    } 
} 

Outprint:

iss[0] is false 
iss[1] is true 
iss[2] is true 
iss[3] is true 
iss[4] is true 
iss[5] is false 
iss[6] is true 
iss[7] is true 
url[0] is false 
url[1] is true 
url[2] is true 
url[3] is true 
url[4] is true 
url[5] is false 
url[6] is true 
url[7] is true 
This is sample text. 

結論:它工作時,我用getClass().getResource("/resources/txtFile.txt")getClass().getClassLoader().getResource("resources/txtFile.txt")getResourceAsStream()也適用)。