我有这个 Java 代码,它创建并保存一个 zip 文件,其中包含一个文本文件:
public static void main(String[] args) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos)) {
String s = "Hello, world!";
ZipEntry entry = new ZipEntry("text_file.txt");
zos.putNextEntry(entry);
zos.write(s.getBytes());
zos.closeEntry();
try (OutputStream os = new FileOutputStream("zip_file.zip")) {
baos.writeTo(os);
System.out.println("ZIP file created successfully");
}
} catch (IOException e) {
System.out.println("Error: " + e);
}
}
此代码的问题是它创建了一个已损坏的 zip 文件,因此我无法提取甚至无法打开其中的内容。
最终我发现如果我手动关闭ZipOutputStream
通过输入zos.close()
之后zos.closeEntry()
zip 文件已成功创建,没有损坏。老实说,这对我来说没有任何意义,因为我已经声明了 ZipOutputStream
里面 try-with-resource声明,所以我希望它会自动关闭。
所以看来 try-with-resource 语句实际上并没有关闭流。我做错了什么吗?
如有任何帮助,我们将不胜感激。
操作系统:Windows 10
注意:我使用了 ByteArrayOutputStream
因为在实际场景中,我必须在内存中创建 zip 文件,因为我在磁盘上没有可以依赖的文件夹。
最佳答案
try-with-resources
确实关闭ZipOutputStream
。只是在将其内容复制到 FileOutputStream 后,它会关闭 zip 流。您期望文件关闭后发生的工作如何影响文件的内容?
我建议将 ByteArrayOutputStream
替换为 FileOutputStream
。您需要缓冲什么?
try (OutputStream os = new FileOutputStream("zip_file.zip");
ZipOutputStream zos = new ZipOutputStream(os)) {
String s = "Hello, world!";
ZipEntry entry = new ZipEntry("text_file.txt");
zos.putNextEntry(entry);
zos.write(s.getBytes());
zos.closeEntry();
}
System.out.println("ZIP file created successfully");
关于Java - try-with-resources 中的 ZipOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71789206/