我正在尝试用Java解压缩大约8000个gzip格式的文件。我的第一次尝试是使用GZIPInputStream,但性能很差。
任何人都知道解压缩gzip档案的替代方法吗?我尝试了ZipInputStream,但它没有识别gzip格式。
提前谢谢你。
答案 0 :(得分:8)
您需要使用缓冲。编写小块数据将是低效的。压缩实现采用Sun JDK中的本机代码。即使不是缓冲性能,通常也应该超过合理的文件或网络I / O.
OutputStream out = new BufferedOutputStream(new GZIPOutputStream(rawOut));
InputStream in = new BufferedInputStream(new GZIPInputStream(rawIn));
由于本机代码用于实现解压缩/压缩算法,因此在使用后要非常小心地关闭流(而不仅仅是底层流)。我发现有很多“Deflaters”闲置在非常对性能不利。
ZipInputStream
处理文件档案,这与压缩流完全不同。
答案 1 :(得分:4)
当你说GZipInputStream
的表现糟糕时,你会更具体吗?您是否发现它是CPU瓶颈还是I / O瓶颈?您是否在输入和输出上使用缓冲?如果您可以发布您正在使用的代码,那将非常有用。
如果您使用的是多核计算机,则可以尝试使用GZipInputStream
,但使用多个线程,每个核心一个,仍然需要处理共享的文件队列。 (任何一个文件只能由一个线程处理。)如果你受I / O限制,可能会使事情变得更糟,但值得一试。
答案 2 :(得分:-2)
对于这种规模,假设您的平台要求有限,您可能希望本机化。您可以使用JNI调用库或使用ProcessBuilder
调用本机命令。