2015-06-21 89 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()也适用)。