Java从jar加载文件
问题描述:
我不明白如何从生成的jar文件加载文件。Java从jar加载文件
这是我的代码,它工作正常的IDE中,而不是当我运行jar:
URL url = ClassLoader.getSystemResource(".");
try
{
File dir = new File(url.toURI());
for (File f : dir.listFiles())
{
String fn = f.getName();
if (fn.endsWith(".png"))
{
ImageView iv = new ImageView(fn);
// ...
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
罐的结构是:
- META-INF
- de(以及带有类文件的其余包)
- file1
- file2
- ...等等
所以这些文件直接在jar中没有在任何子文件夹中。
答
您的代码不起作用,因为File对象不能用于访问jar内的文件。你可以做的是使用ZipInputStreams打开&阅读你的jar文件和ZipEntry一起读取你的jar中的单个文件。 此代码可以在jar中工作,但很可能不在IDE中。在这种情况下,您可以检测当前状态(IDE或Jar)并相应地执行所需的加载代码。
CodeSource src = ClientMain.class.getProtectionDomain().getCodeSource();
URL jar = src.getLocation();
ZipInputStream zip = new ZipInputStream(jar.openStream());
ZipEntry entry = null;
while ((entry = zip.getNextEntry()) != null) {
String entryName = entry.getName();
if (entryName.endsWith(".png")) {
BufferedImage image = ImageIO.read(zip);
// ...
}
}
使用的URL已经建立,我们可以判断,如果该程序是在一个罐子或不符合这个简单的代码:
new File(jar.getFile()).toString().endsWith("jar")
这工作,因为当在IDE中,(在我的情况蚀) new File(jar.getFile()).toString()
回报 "D:\Java\Current%20Projects\Test\bin"
其中在一个罐子里,我得到了 "D:\Windows%20Folders\Desktop\Test.jar"
谢谢,这完美的作品! – expensne