首页 > 解决方案 > 如何检查给定的输入流(zip 文件)是否受密码保护或不使用 java?

问题描述

我有 zip 文件的输入流,想检查这个输入流是否受密码保护。我已经阅读了这篇How to use zip4j to extract an zip file with password protection

String source = "folder/source.zip";
String destination = "folder/source/";
String password = "password";

try {
ZipFile zipFile = new ZipFile(source);
if (zipFile.isEncrypted()) {
    zipFile.setPassword(password);
}
zipFile.extractAll(destination);
} catch (ZipException e) {
e.printStackTrace();
}

在这个网站上面给出了解决方案。但我没有文件或文件路径位置。我只有 zip 文件的输入流,有人可以告诉我如何检查给定的输入流(zip 文件)是否受密码保护。提前致谢。

标签: javazipzipfilepassword-protection

解决方案


抱歉,我认为没有一个库可以完全满足您的需求。

  • zip4jZipFile只能打开一个File或一个String路径名。

  • Java SEZipFile只能打开一个File或一个String路径名......并且不支持加密条目。

  • Java SEZipInputStream确实支持InputStream,但不支持加密条目。

  • Apache CommonsZipFile确实支持可搜索的输入流(和通道),但不支持InputStream. 而且它不理解加密的条目。

  • Apache CommonsZipInputStream适用于任何InputStream但它不理解加密条目。


那么有哪些选择呢?

最简单的选择是将InputStream内容复制到一个临时文件,然后ZipFile根据您问题中的代码使用 zip4j。完成后,删除临时文件。

理论上,您应该能够使用 Java SEZipInputStream并扫描条目以检查FileHeader每个文件。(“通用位”字段的第 0 位告诉您文件是否已加密。)问题在于ZipEntry它不会公开信息。

但是,Apache 的ZipInputStream类(可以读取InputStream!)公开了通用位字段。因此,这将提供一种方法来测试 ZIP 中的任何文件是否已加密。如果这就是您所需要的,那么您还有另一个可能的选择。


推荐阅读