You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

java.util.zip.ZipException异常排查:已添加条目却提示无当前ZIP条目

解决java.util.zip.ZipException: no current ZIP entry异常

问题根源

你将BufferedWriter与ZipOutputStream放在了同一个外层try-with-resources块中,Java的try-with-resources会按声明的逆序关闭资源——也就是说BufferedWriter会先于ZipOutputStream被关闭。

当BufferedWriter关闭时,它会尝试将缓冲的数据写入底层的ZipOutputStream,但此时你已经执行了zipOutputStream.closeEntry(),没有活跃的ZIP条目,因此触发了no current ZIP entry异常。

修复后的代码

public void createZip(Path source) throws Exception {
    try (ZipOutputStream zipOutputStream = new ZipOutputStream(Files.newOutputStream(zipFile))) {
        String entryName = source.getFileName().toString();
        System.out.println(entryName);
        zipOutputStream.putNextEntry(new ZipEntry(entryName));

        // 将BufferedWriter移至当前条目存在的作用域内
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(Files.newInputStream(source)));
             BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(zipOutputStream))) {
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine(); // 可选:保留原文件换行结构,避免内容粘连
            }
        }

        zipOutputStream.closeEntry();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

额外优化说明

  • 替换reader.ready()判断为(line = reader.readLine()) != null:ready()仅判断流是否可读取,不能作为文件结束的可靠标志。
  • 添加writer.newLine():原代码中readLine()会丢弃换行符,此操作可确保压缩后文件的换行格式与原文件一致。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:33:28