区分 *.zip 文件和压缩的容器文件

问题描述

我有一个数据输入流,它是一个文件内容,但没有附加任何文件信息。我希望能够区分数据表示 *.zip 文件的情况,以及它是在封面下使用 zip 的容器文件格式(例如 *.docx、*.odt、*.jar)的情况。我不一定需要知道容器格式是什么,只需要知道流是否是“普通”zip(所以我知道将流拆分为单独的文件是否合适)。

这可能吗?我很乐意在解压之后或之前进行检测。

理想情况下,我正在尝试使用 Java 来执行此操作,但如果有其他语言的代码示例,那么我很乐意在必要时移植它们。

解决方法

没有绝对可靠和正确的方法来做到这一点,因为那些使用 ZIP 格式作为容器的格式往往是 100% 有效和正确的 ZIP 文件。

所以它们 ZIP 文件。

但是,由于这些格式的数量不是无限的(并且只有其中的一小部分在现实世界中很常见),您可能只需专门检测这些格式并处理所有您不知道的格式即可识别为“真实”ZIP 文件。

大多数这些格式都需要在文件的早期字节中使用某种易于检查的标识符,因此如果您可以编写特定于规范的代码,那应该很容易。

file 可以正确检测大部分格式,因此查看其来源应该会给您足够的提示。

一些例子:

也很可能(尚未检查)Apache Tika 已经完成了所有检测。