从资源加载文件会产生错误的路径

时间:2016-02-10 09:32:26

标签: java jar

我有一个propeties文件,其中包含jar文件中的文件路径

logo.cgp=images/cgp-logo.jpg

此文件已存在:

enter image description here

我想在我的项目中加载此文件,所以我这样做:

String property = p.getProperty("logo.cgp"); //This returns "images/cgp-logo.jpg"
File file = new File(getClass().getClassLoader().getResource(property).getFile());

但是当我file.exists()时,我得到了false。当我检查file.getAbsolutePath()时,它会导致C:\\images\\cgp-logo.jpg

我做错了什么?

2 个答案:

答案 0 :(得分:2)

jar中的文件只是不是常规文件。它是一种可以由ClassLoader加载并作为流而不是文件读取的资源。

根据Javadocs,getClass().getClassLoader().getResource(property)在网址上返回URLgetFile()说:

  

获取此URL的文件名。返回的文件部分将与getPath()相同,加上getQuery()的值的串联(如果有)。如果没有查询部分,则此方法和getPath()将返回相同的结果。

因此,对于jar资源,它与返回的getPath()相同:

  

此网址的路径部分,如果不存在,则为空字符串

所以,在这里,您将返回/images/cgp-logo.jpg 相对于类路径 ,它与文件系统上的真实文件不对应。这也解释了file.getAbsolutePath()

的返回值

访问资源的正确方法是:

InputStream istream =  getClass().getClassLoader().getResourceAsStream(property)

答案 1 :(得分:0)

您可以像这样使用JarFile类:

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();
}