【发布时间】:2021-07-04 18:00:58
【问题描述】:
我正在尝试对通过 ZipInputStream 接收的受密码保护的 zip 文件使用 zip4j。它大部分运行良好,但我有一个带有子目录的 .zip 文件,当我循环它时,我只看到一个目录。
小例子:
- 创建一个受密码保护的 zip,其中包含一个目录和 1 个文件(为简单起见,我选择了密码“密码”)。 您的 zip 将如下所示:
$ unzip -l test_dir.zip
Archive: test_dir.zip
Length Date Time Name
--------- ---------- ----- ----
0 07-04-2021 21:36 test_dir/
0 07-04-2021 21:36 test_dir/test_file
--------- -------
0 2 files
- 使用 ZipInputStream 加载 zip
public void minimalExample() throws IOException {
InputStream inputStream = getClass().getResourceAsStream("test_dir.zip");
LocalFileHeader localFileHeader;
ZipInputStream zipInputStream = new ZipInputStream(inputStream, "password".toCharArray());
while ((localFileHeader = zipInputStream.getNextEntry()) != null) {
Log.w("File found:", localFileHeader.getFileName());
}
}
如果 .zip 受密码保护,输出将如下所示:
W/File found:: test_dir/
(因此,没有找到 test_dir/test_file!如果它没有密码保护,则此方法有效)
有人对我可能做错的地方有什么建议吗?
【问题讨论】:
-
所以使用子目录进行常规 zip 解压工作正常吗?如果是这样,请将其转换为带有 instructions 的minimal reproducible example,而不是在您的 MCVE 代码读入时如何创建显示问题的 zip 文件的链接。 (因为除了links die, which shouldn't invalidate SO questions 之外,没有人会从一个未知的仓库下载一个随机的 zip 文件,这只是在自找麻烦;)
-
我已经重新格式化它以使用一个最小的可重现示例和有关如何创建此类 .zip 文件的说明。
-
谢谢,但请将该 java 代码更新为完全限定的
Test.java或类似代码,从最低限度的导入开始,并拥有一个公共静态主文件,依赖于具有该硬编码名称的文件,以便人们可以复制并运行它,而不会出现任何编译错误。此外,您还没有回答第一个问题:使用子目录进行常规 zip 解包(因此:没有密码)是否可以正常工作? -
老实说,我不知道该怎么做。我只喜欢 Android 开发,而一个 Android 项目会因为所有的样板而大得像地狱,以至于它比这更不清晰。常规 Java 对我来说已经很长了。不,我确实回答了这个问题:它有效。请再读一遍:“如果没有密码保护,这可以工作”