检测压缩文件java

时间:2012-09-10 15:56:11

标签: java stream inputstream compression

大家好好读一读。

我正在使用Java程序,我没有成功,但我正在改进它,问题是你可以添加文件,但我想验证所以添加的文件不会以任何人类已知的格式压缩,所以我不想要人们可以添加一个zip文件或rar或7z或gz,等等。

任何人都可以帮助我一个想法,这甚至可能吗?

提前感谢。

*编辑: 它由IT学生使用的程序,他们添加源代码的文件(.java,.class,.php,.doc,.mdb),路径保存在字符串中,最后,程序压缩文件,并将它们发送给老师,知道教师不想接收压缩或压缩文件,这就是验证的原因。

3 个答案:

答案 0 :(得分:4)

你基本上在文件的字节上执行java等价的unix命令type。大多数文件都有嵌入式指纹,可以向其他程序提供有关文件类型的提示。此指纹通常称为“幻数”

7zip - '7', 'z', 0xBC, 0xAF, 0x27, 0x1C
gzip - 0x1F, 0x8B

一个(不完整)list of magic numbers can be found here

某些文件没有幻数,在这种情况下,您必须在文件中查找其他常用项​​,这些项强烈暗示它是可疑类型的文件。

依赖文件扩展名只会让每个人最终重命名扩展名。

答案 1 :(得分:1)

大多数压缩文件类型在开头都有一个“幻数”,几个字节表示文件类型(不仅是压缩文件,还有图像等)。您可以根据已知文件类型检查文件内容。您可以谷歌“魔术数字文件类型”。

答案 2 :(得分:0)

FWIW,此函数检查文件是否被gzip压缩:

public static boolean isGzipped(File f) {
    InputStream is = null;
    try {
        is = new FileInputStream(f);
        byte [] signature = new byte[2];
        int nread = is.read( signature ); //read the gzip signature
        return nread == 2 && signature[ 0 ] == (byte) 0x1f && signature[ 1 ] == (byte) 0x8b;
    } catch (IOException e) {
        Log.x(e);
        return false;
    } finally {
        Closer.closeSilently(is);
    }
}

See Closer.closeSilently() here.