首页 > 解决方案 > 用Java提取GZ文件

问题描述

我正在尝试从文件中提取CSV文件GZ

到目前为止,我已经尝试了以下方法来进行此操作:

Archiver archiver = ArchiverFactory.createArchiver(null, CompressionType.GZIP);
archiver.extract(archiveFile, destFile);

或者

GzipCompressorInputStream archive = new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(archiveFile)));
OutputStream out = new FileOutputStream(destFile);
IOUtils.copy(archive, out);
out.close();
archive.close();

或者

GZIPInputStream archive= new GZIPInputStream(new FileInputStream(archiveFile));
OutputStream out = new FileOutputStream(destFile);
IOUtils.copy(archive, out);
out.close();
archive.close();

我还尝试了Snappy,它是 github 上的(非)压缩库。

在每种情况下,我都会显示以下错误

java.io.IOException: Gzip-compressed data is corrupt

我已经GZ使用以下控制台命令检查了文件的有效性,它说一切都应该没问题。

gzip -v -t MyFileToUncompress.csv.gz
MyFileToUncompress.csv.gz: OK

这些GZ文件是通过控制台命令或 Java 本身或在 Windows 上压缩的。到目前为止结果相同。

是我做错了什么还是我的 Java 有问题(JDK 1.7 或 1.8 产生相同的异常)?

标签: javacompressiongzipgzipinputstream

解决方案


这是我用于 gunzip 的代码,尽管它看起来不会产生不同的结果,因为它与您的第三个示例基本相同:

try(final OutputStream out = Files.newOutputStream(fout);
    final InputStream in   = new GZIPInputStream(Files.newInputStream(fin))) {
    in.transferTo(out);
}

但是,值得检查您的结果是否使用最新的 JDK 更改,并检查是否gzip -d MyFileToUncompress.csv.gz生成了预期的文件。


推荐阅读