java - 在 Java 中使用 Zip 和 GZip 文件

标签 java file-io zip gzip

自从我完成 Java I/O 以来已经有一段时间了,而且我不知道使用 Zip 和 GZip 文件的最新“正确”方法。我不一定需要完整的工作演示 - 我主要是在寻找要使用的正确接口(interface)和方法。是的,我可以查找任何关于此的随机教程,但性能是一个问题(这些文件可能会变得非常大),我确实关心使用最好的工具来完成这项工作。

我将实现的基本流程:

  • 将一堆文件(可能是压缩文件、gzip 文件或两者)下载到临时文件夹。
  • 将所有提取的文件添加到临时文件夹中的新 zip 文件。

输入文件可能会被多次压缩和归档。例如,“完全提取”应该采用以下任何输入(我无法控制这些),并留下 foo.txt:

  • foo.txt.gz
  • foo.txt.zip
  • foo.txt.gz.zip
  • foo.txt.zip.gz
  • ...
  • foo.txt.gz.gz.gz.zip.gz.zip.zip.gz.gz
  • ...

然后,我可能只剩下 foo.txtbar.mp3baz.exe - 所以我会把它们全部添加到具有一些通用名称的新 zip 文件。

问题:

  • 由于文件大小是一个潜在的问题,我应该快速使用哪些(接口(interface)/类/方法):
    • 提取 zip 文件?
    • 提取 gzip 文件?
    • 写 zip 文件?
  • 在写回磁盘之前,我是否最好将单独提取的文件保存在内存中?或者,
  • 潜在的大文件是否会成为一个坏主意?

最佳答案

不要将所有这些未压缩的数据保存在内存中,否则您可能会耗尽堆空间。您需要在解压缩时将数据流出到文件,然后在您要创建最终 zip 文件时将其从文件流回。

我以前没有做过压缩文件,但这里有一个例子展示了如何解压缩一个gzipped文件:

import java.io.*;
import java.util.zip.*;

//unzipping a gzipped file
GZIPInputStream in = null;
OutputStream out = null;
try {
   in = new GZIPInputStream(new FileInputStream("file.txt.gz"));
   out = new FileOutputStream("file.txt");
   byte[] buf = new byte[1024 * 4];
   int len;
   while ((len = in.read(buf)) > 0) {
       out.write(buf, 0, len);
   }
}
catch (IOException e) {
   e.printStackTrace();
}
finally {
   if (in != null)
       try {
           in.close();
       }
       catch (IOException ignore) {
       }
   if (out != null)
       try {
           out.close();
       }
       catch (IOException ignore) {
       }
}

关于java - 在 Java 中使用 Zip 和 GZip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3711282/

相关文章:

java - 带有外部库的 Robolectric NoClassDefFoundError

java - XPages - 更新 Java 类设计元素

c - 从文件填充数组

Java Zip 文件提取

ios - RxSwift - 如何使用 Observable.zip 处理不同的错误场景

linux - inotifywait 可以说文件在可供其他进程访问之前已关闭吗?

java - 通过 JUnit 测试确认 FileReader 已正确关闭

java - 如何修复 1.6 中低于 1.7 的源代码级别不允许使用 '<>' 运算符?

c - 在c中读取二进制文件的各个部分

Python-从函数中的文本文件中读取数字