java - 如何检查给定的输入流(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 文件)是否受密码保护。提前致谢。
解决方案
抱歉,我认为没有一个库可以完全满足您的需求。
zip4j
ZipFile
只能打开一个File
或一个String
路径名。Java SE
ZipFile
只能打开一个File
或一个String
路径名......并且不支持加密条目。Java SE
ZipInputStream
确实支持InputStream
,但不支持加密条目。Apache Commons
ZipFile
确实支持可搜索的输入流(和通道),但不支持InputStream
. 而且它不理解加密的条目。Apache Commons
ZipInputStream
适用于任何InputStream
但它不理解加密条目。
那么有哪些选择呢?
最简单的选择是将InputStream
内容复制到一个临时文件,然后ZipFile
根据您问题中的代码使用 zip4j。完成后,删除临时文件。
理论上,您应该能够使用 Java SEZipInputStream
并扫描条目以检查FileHeader
每个文件。(“通用位”字段的第 0 位告诉您文件是否已加密。)问题在于ZipEntry
它不会公开信息。
但是,Apache 的ZipInputStream
类(可以读取InputStream
!)公开了通用位字段。因此,这将提供一种方法来测试 ZIP 中的任何文件是否已加密。如果这就是您所需要的,那么您还有另一个可能的选择。
推荐阅读
- powershell - 删除旧文件夹并保留最新的
- angular - highcharts-angular 从数据库动态更新
- c# - 自定义 DataGridViewButtonCell 上的右对齐按钮
- azure - 如何在 Azure 中开发和部署几个不同的机器人?
- scala - 如何从 scala 中的 Map.Entry 集中获取键或值集?
- android - AbstractAccountAuthenticator 只允许 1 个帐户
- c++ - 在 cmake 中为 INTERFACE 库设置 LINK_FLAGS
- canvas - 具有屏幕尺寸的响应式变化页面上的画布 x,y 值
- python-3.x - 如何让 Spacy 的统计模型更快
- profiling - Perf 错误:sys_perf_event_open() 系统调用为事件 (msr/tsc/) 返回了 22(无效参数)