用Java解压缩GZ文件

huangapple go评论108阅读模式
英文:

Extract GZ file with Java

问题

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

到目前为止,我尝试了以下方法来执行这个操作:

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

或者

  1. GzipCompressorInputStream archive = new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(archiveFile)));
  2. OutputStream out = new FileOutputStream(destFile);
  3. IOUtils.copy(archive, out);
  4. out.close();
  5. archive.close();

或者

  1. GZIPInputStream archive = new GZIPInputStream(new FileInputStream(archiveFile));
  2. OutputStream out = new FileOutputStream(destFile);
  3. IOUtils.copy(archive, out);
  4. out.close();
  5. archive.close();

我还尝试了在 GitHub 上的 (un)compressionSnappy

在每种情况下,我都得到了如下显示的错误

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

我使用以下控制台命令检查了 GZ 文件的有效性,命令显示一切应该都没问题:

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

GZ 文件无论是通过控制台命令、Java 本身还是在 Windows 上进行的压缩,结果都相同。

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

英文:

I'm trying to extract a CSV file from a GZ file.

So far, I've tried the following ways to make this operation:

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

Or

  1. GzipCompressorInputStream archive = new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(archiveFile)));
  2. OutputStream out = new FileOutputStream(destFile);
  3. IOUtils.copy(archive, out);
  4. out.close();
  5. archive.close();

Or

  1. GZIPInputStream archive= new GZIPInputStream(new FileInputStream(archiveFile));
  2. OutputStream out = new FileOutputStream(destFile);
  3. IOUtils.copy(archive, out);
  4. out.close();
  5. archive.close();

I've also given a try to Snappy which is a (un)compression lib on github.

In every case, I got the following error displayed:

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

I've checked the GZ files validity with the following console command, which says everything should be alright.

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

The GZ files were compressed by console command or by Java itself or on a Windows. Same result so far.

Is there something I'm doing wrong or is that an issue on my Java (JDK 1.7 or 1.8 produce the same exception) ?

答案1

得分: 0

这是我用于解压缩的代码,尽管看起来似乎不会产生与第三个示例不同的结果,因为它本质上与您的第三个示例相同:

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

然而,值得检查您是否使用了最新的JDK来查看结果是否有变化,并且还要检查 gzip -d MyFileToUncompress.csv.gz 是否生成了预期的文件。

英文:

Here is code I use for gunzip, though it doesn't look as though it would produce a different outcome as it is essentially same as your third example:

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

However it is worth checking whether your result changes using latest JDK, and also check that gzip -d MyFileToUncompress.csv.gz generates the expected file back.

huangapple
  • 本文由 发表于 2020年8月27日 15:19:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/63611018.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定