我有一个propeties文件,其中包含jar文件中的文件路径
logo.cgp=images/cgp-logo.jpg
此文件已存在:
我想在我的项目中加载此文件,所以我这样做:
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
我做错了什么?
答案 0 :(得分:2)
jar中的文件只是不是常规文件。它是一种可以由ClassLoader加载并作为流而不是文件读取的资源。
根据Javadocs,getClass().getClassLoader().getResource(property)
在网址上返回URL
和getFile()
说:
获取此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();
}