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

Distinguishing between *.zip file and zipped container files

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

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

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

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

所以它们 ZIP 文件。

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

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

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

一些示例:

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