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
相关产品推荐
相关产品推荐

