You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将Zip文件作为资源读取时出现异常编码变更问题

解决JAR包中Zip资源遍历的问题

嘿,我太懂这种困扰了!IDE里代码跑的顺风顺水,一打包成JAR就各种找不到资源——本质原因是IDE运行时,你的Zip文件是在文件系统的真实目录里,所以用普通的File类就能访问;但打包成JAR后,所有资源都变成了JAR内部的压缩条目,不再是文件系统里的独立文件,File自然找不到路径了。

给你两个关键解决步骤,亲测有效:

1. 改用类加载器的资源流读取Zip

别再用new File("src/main/resources/data.zip")这种方式了,换成类加载器获取输入流,直接从JAR里读取Zip内容:

// 用当前类的类加载器获取Zip资源流,路径开头的/表示类路径根
try (ZipInputStream zipInputStream = new ZipInputStream(
        getClass().getResourceAsStream("/your-zip-file.zip")
)) {
    ZipEntry entry;
    // 遍历Zip里的所有条目
    while ((entry = zipInputStream.getNextEntry()) != null) {
        // 跳过目录,只处理JSON文件
        if (!entry.isDirectory() && entry.getName().toLowerCase().endsWith(".json")) {
            // 读取JSON内容,这里用BufferedReader举例
            BufferedReader reader = new BufferedReader(new InputStreamReader(zipInputStream));
            StringBuilder jsonContent = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                jsonContent.append(line);
            }
            // 这里写你的JSON处理逻辑,比如解析成对象等
            System.out.println("处理JSON文件:" + entry.getName());
            
            // 记得关闭当前Zip条目
            zipInputStream.closeEntry();
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

如果是在静态方法里,把getClass()换成你的类名.class就行,比如YourService.class.getResourceAsStream(...)

2. 确保Maven正确打包Zip文件

有时候问题出在打包环节,Maven默认会打包resources下的文件,但保险起见,你可以在pom.xml里明确配置,确保Zip文件被包含进去:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.zip</include>
                <!-- 如果还有单独的JSON文件也可以加上 -->
                <include>**/*.json</include>
            </includes>
        </resource>
    </resources>
</build>

额外注意点

  • 路径一定要写对:如果你的Zip放在resources的子目录里,比如resources/json/data.zip,那路径就要写成/json/data.zip
  • 务必用try-with-resources语法,它会自动帮你关闭流,避免资源泄漏
  • 不要尝试把JAR里的资源复制到临时文件再处理(虽然也能行,但没必要,直接用流处理更高效)

内容的提问来源于stack exchange,提问作者Andrew W

火山引擎 最新活动