自从我完成 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.txt
、bar.mp3
、baz.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/