Java如何按不带扩展名的文件名加载对应资源文件
无固定扩展名图片加载的优化实现
你当前逐次试错的实现存在两个明显短板:一是需要硬编码维护图片扩展名列表,后续新增图片格式就得回头改加载逻辑;二是每试错一次就创建一个IO异常、捕获后直接吞掉,频繁的异常对象创建会带来不必要的性能消耗。
核心优化思路
不需要提前枚举所有可能的扩展名,直接定位图片所属的目标目录,通过目录扫描匹配「主文件名和目标无扩展名名称完全一致」的文件,命中后直接读取返回即可。这种实现完全不需要维护扩展名清单,后续新增webp、avif等任意图片格式都不需要改动加载代码。
具体实现步骤
- 先构建图片所在目录的路径,对应你代码里的
src/main/resources/static/images/{id}目录,不要直接拼接带扩展名的目标文件路径 - 校验该目录是否存在、是否具备可读权限,不满足则直接返回空结果
- 扫描目录下的所有普通文件,筛选规则为:文件去掉自身扩展名后的主文件名,和传入的目标
imageName完全匹配 - 取第一个筛选命中的文件,读取全量字节返回即可;遍历完目录没有匹配结果,再按业务逻辑抛出文件不存在的异常
参考实现代码
Path imageDir = Paths.get("src/main/resources/static/images", id); String targetImageName = imageName; byte[] imageBytes = null; // 校验目录合法性 if (Files.isDirectory(imageDir)) { try (Stream<Path> fileStream = Files.list(imageDir)) { imageBytes = fileStream .filter(Files::isRegularFile) .filter(path -> { String fileName = path.getFileName().toString(); int dotIndex = fileName.lastIndexOf("."); // 兼容文件无扩展名的极端场景 String mainName = dotIndex == -1 ? fileName : fileName.substring(0, dotIndex); return mainName.equals(targetImageName); }) .findFirst() .map(path -> { try { return Files.readAllBytes(path); } catch (IOException e) { throw new RuntimeException(e); } }) .orElse(null); } catch (IOException e) { // 按业务逻辑处理目录读取异常即可 } }
场景适配提醒
如果项目最终是打包为Jar包运行,
src/main/resources下的资源会嵌套在Jar包内部,此时不能直接用文件系统API扫描Jar内部路径。可以使用框架提供的资源解析能力,通过通配符模式classpath:static/images/{id}/{imageName}.*匹配资源,同样不需要指定具体扩展名就能加载到对应文件。
内容的提问来源于stack exchange,提问作者user12907027
相关产品推荐
相关产品推荐

