是否可以检查文件(.gz)是否被多次压缩?

时间:2016-08-09 19:25:22

标签: java io gz

我看到的情况是,将具有专有格式的文件压缩为.gz,然后将其重命名为其原始扩展名,然后再次压缩。我想捕获这样的场景,并想知道是否有办法检测文件何时被压缩两次。

我正在阅读.gz文件,如下所示:

 GZIPInputStream gzip = new GZIPInputStream(Files.newInputStream(inFile));
 BufferedReader breader = new BufferedReader(new InputStreamReader(gzip)); 

2 个答案:

答案 0 :(得分:2)

您可以在文件中检查有效的gzip标头。 gzip文件应该包含一个以2字节数开头的定义标头,其值为0x1f和0x8b(参见spec)。您可以检查这些字节以查看它们是否与标头值匹配:

InputStream is = new FileInputStream(new File(filePath));
byte[] b = new byte[2];
int n = is.read(b);
if ( n != 2 ){
    //not a gzip file
}
if ( (b[0] == (byte) 0x1f) && (b[1] == (byte)0x8b)){
    //2-byte gzip header
}

单独这两个字节的随机发生几率为~1 / 65k,但根据您希望接收的数据,可能足以作出决定。为了对调用更有信心,您可以进一步阅读标题,以确保它遵循有效的规范值(请参阅上面的链接 - 例如,第三个字节通常但不总是8用于DEFLATE压缩,并且等......)

答案 1 :(得分:1)

蛮力方式是:解压缩文件;如果有效;尝试再次解压缩它。如果再次起作用,则表示它已被压缩(至少两次)。但最坏的情况是,它仍然可以被压缩。

实际上;我没有其他方法来解决这个问题。

您最终看到压缩是关于更改文件的字节数。所以,即使第二次压缩对文件内容没有太大作用;它仍会改变一些字节。所以,只要查看这些字节,就不会看到发生了什么。