我已经编写了一个Java swing应用程序,该应用程序必须从资源中查找其图标。因此,我想在可运行的jar文件的特定文件夹中找到任何png。我不知道在那里会有什么名字。
要在资源文件夹中查找png,请使用以下代码:
private List<String> getResourceFolderFileNames(String folder) {
List<String> names = new ArrayList<>();
File jarFile = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
System.out.println("Folder to search in: " + folder);
try {
if (jarFile.isFile()) {
System.out.println("This is a jar file dir");
JarFile file = new JarFile(jarFile);
Enumeration<JarEntry> entries = file.entries();
List<JarEntry> jarEntries = new ArrayList<>();
while (entries.hasMoreElements()) {
jarEntries.add(entries.nextElement());
}
System.out.println("Number of entries: " + jarEntries.size());
for (JarEntry e: jarEntries
) {
String name = e.getName();
if (name.matches(".*/" + folder + "/[0-9]+\\.png")) {
name = name.split("/")[2];
System.out.println("Added name: " + name);
names.add(name);
}
}
} else {
System.out.println("This is not a jar file");
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL url = loader.getResource("resources/" + folder);
String path = url.getPath();
for (File f: new File(path).listFiles()
) {
names.add(f.getName());
}
}
} catch (Exception e) {
System.out.println(e.getMessage() + "catch in get Resource folder file names");
}
return names;
}
该代码的理想行为是,它将返回一个包含所有******。png文件名的字符串列表。
else部分实际上还不能工作,但是程序永远无法到达。这部分适用于在IDE中开始搜索的情况,因为它在那里的工作方式有所不同(指出了其他一些问题)。似乎在“ jarFile.isFile()”上确实失败了。
错误:
当我在Windows或Mac上启动导出的可运行jar文件时,它工作得很好。它确实做了它应该做的。如果我从网络文件夹启动相同的可运行jar文件,则找不到png文件。
项目结构
这是我的图标所在的位置
--src/
--resources/
--iconfolder1
--iconfolder2
如果现在需要更多信息,我会尽力帮助您。非常感谢。
修改1:
现在它可以在IDE中再次使用,但仍然不能在网络上使用。
br 亚历克斯
答案 0 :(得分:0)
代码本身实际上没有错。
发生的事情是,getLocation返回一个URL,因此使用getPath进行URL编码。因此,当路径中有空格时,它们将被编码为%20。 File的构造函数不会对此进行解码,因此无法读取路径。
File jarFile = new File(URLDecoder.decode(getClass().getProtectionDomain().getCodeSource().getLocation().getPath(), "UTF-8"));
因此,在创建新文件之前对字符串进行解码将按预期执行。