Java - try-with-resources 中的 ZipOutputStream

标签 java try-with-resources zipoutputstream

我有这个 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/

相关文章:

java - 使用 Java 在内存中创建 zip 文件时出错

Java - 如何显示图像?

JavaFX 进度指示器添加神秘的额外值?

java - 如何将此 try-finally 更改为 try-with-resources?

java - 在一个 try 语句中打开多个资源不可靠吗?为什么?

java - "IllegalArgumentException: UNMAPPABLE[1]"压缩带有希腊字符的文件时

java - 从远程系统提交 mapreduce 作业时出现异常

java - 无法从 Eclipse 中的单独项目获取 Json 文件

java - Java中如何关闭OutputStream列表?

java - 使用 ZipOutputStream 压缩时 zip 无效