如何在JAR/EXE应用中读取resources目录下的GIF文件列表?
问题根源
你原来的代码用File类读取resources目录,在IDE运行时资源是磁盘上的真实文件,所以能正常读取;但打包成JAR后,资源是JAR包内的压缩条目,并非独立的文件系统对象,File无法访问这类资源,导致获取不到GIF文件列表,最终抛出异常。
修改方案:通过类加载器遍历JAR内资源
利用Java类加载器访问JAR中的资源,核心是判断资源URL的协议(file对应IDE环境,jar对应打包后的JAR包),分别处理两种场景下的资源遍历:
import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class ResourceHandler { private static final String GIF_EXT = ".gif"; // 替换为你存放GIF的实际资源目录,比如resources下的gifs目录就填"/gifs/" private static final String RESOURCE_ROOT = "/gifs/"; public List<String> getGifResources() throws IOException { List<String> gifPaths = new ArrayList<>(); ClassLoader classLoader = ResourceHandler.class.getClassLoader(); URL resourceUrl = classLoader.getResource(RESOURCE_ROOT.substring(1)); if (resourceUrl == null) { throw new IllegalArgumentException("指定的资源目录不存在: " + RESOURCE_ROOT); } String protocol = resourceUrl.getProtocol(); if ("file".equals(protocol)) { // IDE运行时,直接遍历磁盘目录 java.io.File dir = new java.io.File(resourceUrl.getFile()); if (dir.isDirectory()) { java.io.File[] files = dir.listFiles((d, name) -> name.toLowerCase().endsWith(GIF_EXT)); if (files != null) { for (java.io.File file : files) { gifPaths.add(RESOURCE_ROOT + file.getName()); } } } } else if ("jar".equals(protocol)) { // 处理JAR包内的资源条目 JarURLConnection jarConn = (JarURLConnection) resourceUrl.openConnection(); try (JarFile jarFile = jarConn.getJarFile()) { Enumeration<JarEntry> entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); String entryName = entry.getName(); // 筛选指定目录下的GIF文件,排除目录条目 if (entryName.startsWith(RESOURCE_ROOT.substring(1)) && !entry.isDirectory() && entryName.toLowerCase().endsWith(GIF_EXT)) { gifPaths.add("/" + entryName); } } } } if (gifPaths.isEmpty()) { throw new IllegalArgumentException("未找到任何GIF资源"); } return gifPaths; } }
关键注意事项
- 调整
RESOURCE_ROOT为你实际的GIF存放目录,比如所有GIF放在resources/gifs/下,就设置为"/gifs/" - 类加载器的
getResource方法参数不能以/开头,所以用substring(1)去掉开头的斜杠 - 同时兼容IDE和JAR两种运行环境,保证开发和打包后都能正常获取资源列表
- 筛选时忽略目录条目,只保留文件,并且不区分大小写匹配
.gif后缀
内容的提问来源于stack exchange,提问作者Traqu
相关产品推荐
相关产品推荐

