5

我正在尝试用 Java 解压缩大约 8000 个 gzip 格式的文件。我的第一次尝试是使用 GZIPInputStream 但性能很糟糕。

任何人都知道解压缩 gzip 档案的任何替代方法吗?我尝试了 ZipInputStream,但它无法识别 gzip 格式。

先感谢您。

4

3 回答 3

8

您需要使用缓冲。写入小块数据将是低效的。压缩实现在 Sun JDK 中的本机代码中。即使不是缓冲性能,通常也应该超过合理的文件或网络 I/O。

OutputStream out = new BufferedOutputStream(new GZIPOutputStream(rawOut));

InputStream in = new BufferedInputStream(new GZIPInputStream(rawIn));

由于本机代码用于实现解压缩/压缩算法,因此在使用后关闭流(而不仅仅是底层流)要非常小心。我发现有大量的“Deflaters”对性能非常不利。

ZipInputStream处理文件的存档,这与压缩流完全不同。

于 2009-03-10T17:47:37.157 回答
4

当你说它GZipInputStream的表现很糟糕时,你能更具体一点吗?您是否发现它是 CPU 瓶颈还是 I/O 瓶颈?您是否在输入和输出上都使用缓冲?如果您可以发布您正在使用的代码,那将非常有帮助。

如果您在多核机器上,您可以尝试仍然使用GZipInputStream但使用多个线程,每个核心一个,还有一个共享的文件队列仍有待处理。(任何一个文件都只能由一个线程处理。)如果您受 I/O 限制,这可能会使事情变得更糟,但它可能值得一试。

于 2009-03-10T17:50:31.877 回答
-2

对于这种规模,假设您的平台要求有限,您可能希望采用原生方式。您可以使用 JNI 调用库或使用ProcessBuilder.

于 2009-03-10T17:45:53.620 回答