【发布时间】:2014-08-21 22:23:27
【问题描述】:
要检索通过 gzip 压缩的文件的未压缩大小,您可以读取最后四个字节。我这样做是为了看看是否有任何文件不是他们应该的大小。如果文件小于应有的大小,我使用此代码附加到文件:
GZIPOutputStream gzipoutput = new GZIPOutputStream
(new FileOutputStream(file, true));
while ((len=bs.read(buf)) >= 0) {
gzipoutput.write(buf, 0, len);
}
gzipoutput.finish();
gzipoutput.close();
当然,这会按预期附加到 gzip 文件的末尾。但是,在追加之后,读取 gzip 文件的最后四个字节(以获取未压缩的文件大小)并没有给我预期的结果。我怀疑这是因为使用 GZIPOutputStream 没有正确地将大小字节附加到文件的末尾。
如何修改我的代码以附加正确大小的字节?
编辑
我正在以 little-endian 顺序读取字节,如下所示:
gzipReader.seek(gzipReader.length() - 4);
int byteFour = gzipReader.read();
int byteThree = gzipReader.read();
int byteTwo = gzipReader.read();
int byteOne = gzipReader.read();
// Now combine them in little endian
long size = ((long)byteOne << 24) | ((long)byteTwo << 16) | ((long)byteThree << 8) | ((long)byteFour);
我在想,由于我附加到一个 gzip 文件,它只写入附加的字节而不是总文件大小。这合理吗?
【问题讨论】:
-
GZIPOutputStream中肯定有代码将未压缩的文件大小写为最后四个字节。我不认为这是你的问题。你是如何读取字节的?可能你的阅读顺序不对。 -
我正在以 little-endian 顺序读取字节,如下所示:
gzipReader.seek(gzipReader.length() - 4); int byteFour = gzipReader.read(); int byteThree = gzipReader.read(); int byteTwo = gzipReader.read(); int byteOne = gzipReader.read(); // Now combine them in little endian long size = ((long)byteOne << 24) | ((long)byteTwo << 16) | ((long)byteThree << 8) | ((long)byteFour);我在想,因为我要附加到 gzip 文件,所以它只写入附加的字节而不是总文件大小.这合理吗?
标签: java file stream byte gzip