获取此GZIPInputStream的未压缩大小?

Dav*_*Guo 11 java gzip gzipinputstream

我有一个GZIPInputStream我从另一个构建的ByteArrayInputStream.我想知道gzip数据的原始(未压缩)长度.虽然我可以阅读到最后GZIPInputStream,然后计算数量,它将花费很多时间和浪费CPU.我想在阅读之前知道尺寸.

有没有像一个类似的方法ZipEntry.getSize()GZIPInputStream:

public long getSize ()
从以下版本开始: API Level 1
获取此ZipEntry的未压缩大小.

小智 8

可以通过读取gzip压缩文件的最后四个字节来确定未压缩的大小.

我发现这个解决方案:

http://www.abeel.be/content/determine-uncompressed-size-gzip-file

同样从这个链接有一些示例代码(更正使用long而不是int,以处理2GB和4GB之间的大小,这将int包围):

RandomAccessFile raf = new RandomAccessFile(file, "r");
raf.seek(raf.length() - 4);
byte b4 = raf.read();
byte b3 = raf.read();
byte b2 = raf.read();
byte b1 = raf.read();
long val = ((long)b1 << 24) | ((long)b2 << 16) | ((long)b3 << 8) | (long)b4;
raf.close();
Run Code Online (Sandbox Code Playgroud)

val是以字节为单位的长度.注意:当未压缩文件大于4GB时,无法确定正确的未压缩大小!

  • 您可以用'int val = raf.readInt()'替换第3-7行. (2认同)
  • 根据[原始GZIP格式规范](http://www.zlib.org/rfc-gzip.html):“一个gzip文件由一系列“成员”(压缩数据集)组成。每个成员的格式" 因此,如果您的 gzip 文件包含多个“成员”,那么您只会读取这四个字节中最后一个“成员”的大小。 (2认同)

Jay*_*yen 6

基于@Alexander的回答:

RandomAccessFile raf = new RandomAccessFile(inputFilePath + ".gz", "r");
raf.seek(raf.length() - 4);
byte[] bytes = new byte[4];
raf.read(bytes);
fileSize = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getInt();
if (fileSize < 0)
  fileSize += (1L << 32);
raf.close();
Run Code Online (Sandbox Code Playgroud)


use*_*421 2

GZIPInputStream 是否有类似 ZipEntry.getSize() 的方法

不。它不在Javadoc中=> 它不存在。

你需要这个长度做什么?