java - 区分 *.zip 文件和压缩容器文件
问题描述
我有一个 InputStream 数据,它是文件的内容,但没有附加任何文件信息。我希望能够区分数据表示 *.zip 文件的情况,以及它是在封面下使用 zip 的容器文件格式(例如 *.docx、*.odt、*.jar)的情况。我不一定需要知道容器格式是什么,只需要知道流是否是“普通”zip(所以我知道将流拆分成单独的文件是否合适)。
这可能吗?我很高兴在解压之后或之前进行检测。
理想情况下,我尝试在 Java 中执行此操作,但如果有其他语言的代码示例,那么我很乐意在必要时将它们移植过来。
解决方案
没有绝对可靠和正确的方法可以做到这一点,因为那些使用 ZIP 格式作为容器的格式往往是 100% 有效和正确的 ZIP 文件。
所以它们是ZIP 文件。
但是,由于这些格式的数量不是无限的(并且只有一小部分在现实世界中很常见),因此您可能只需专门检测这些格式并将所有您不认识的内容视为“真正的”ZIP 文件。
这些格式中的大多数都需要在文件的早期字节中使用某种易于检查的标识符,因此如果您可以编写特定于规范的代码,那么它应该很容易。
file
正确检测大多数这些格式,因此查看其来源应该为您提供足够的指示。
一些例子:
- OpenDocument 文件(此文件包含各种档案,而不仅仅是 ODx 文件)。
- Office 打开 XML 文件
Apache Tika也很可能(尚未检查)已经完成了所有检测。
推荐阅读
- pyspark - 我如何在 jupyter notebook 上的 pyspark 中进行测试
- c# - 仅更改对象的 X 轴比例
- ksqldb - KSQL SERVER & 应用程序并行
- android - Kotlin - 将 ListView 的单击项目复制到剪贴板
- c++ - 试图学习指针,为什么要使用它们而不是 &?
- unix - 如何在 Unix 中删除核心文件?
- android - android 和 REST API - 管理用户和对服务器的请求的架构
- python - argparse 需要带有可变参数的选项?
- websocket - 如何修复“AttributeError: 'DistributeHandler' 对象没有属性 'group'”?
- r - 如何删除维恩图边框?