【问题标题】:Detect a compressed file java检测压缩文件java
【发布时间】:2012-09-03 12:43:28
【问题描述】:

大家好,愿意阅读这篇文章的人。

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

谁能帮我出个主意,这甚至可能吗?

提前致谢。

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

【问题讨论】:

  • 请检查这个问题,似乎是一样的[stackoverflow.com/questions/4148987/… [1]:stackoverflow.com/questions/4148987/…
  • 将文件添加到哪里?它是物理文件吗?你能检查文件的前几个字节吗,例如zip 文件以 PK 开头
  • 你只想拥有文本文件的目的是什么?您可以添加未压缩的二进制文件吗?检测压缩文件的一般方法是压缩它并查看它是否更小。如果文件不平凡但不小,则它已经被压缩。例如一个 PNG 文件被压缩。
  • @PeterLawrey,压缩整个文件通常很糟糕,因为它是 CPU/内存密集型操作。你可以选择几个 4/8k 的块,然后看看它们被压缩了。
  • 您能否仅根据文件扩展名进行验证,或者如果它实际上不是压缩文件,您是否希望能够发送类似file.zip 的文件?

标签: java stream inputstream compression


【解决方案1】:

您基本上对文件的字节执行与 unix 命令type 等效的 java。大多数文件都有一个嵌入式指纹,可以向其他程序提示它是什么类型的文件。这种指纹通常被称为“幻数”

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

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

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

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

【讨论】:

    【解决方案2】:

    FWIW,这个函数检查文件是否被压缩:

    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.

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-26
        • 2018-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多