【问题标题】:Unzipping files in directory in password protected ZipInputStream在受密码保护的 ZipInputStream 目录中解压缩文件
【发布时间】:2021-07-04 18:00:58
【问题描述】:

我正在尝试对通过 ZipInputStream 接收的受密码保护的 zip 文件使用 zip4j。它大部分运行良好,但我有一个带有子目录的 .zip 文件,当我循环它时,我只看到一个目录。

小例子:

  1. 创建一个受密码保护的 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
  1. 使用 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 解压工作正常吗?如果是这样,请将其转换为带有 instructionsminimal reproducible example,而不是在您的 MCVE 代码读入时如何创建显示问题的 zip 文件的链接。 (因为除了links die, which shouldn't invalidate SO questions 之外,没有人会从一个未知的仓库下载一个随机的 zip 文件,这只是在自找麻烦;)
  • 我已经重新格式化它以使用一个最小的可重现示例和有关如何创建此类 .zip 文件的说明。
  • 谢谢,但请将该 java 代码更新为完全限定的 Test.java 或类似代码,从最低限度的导入开始,并拥有一个公共静态主文件,依赖于具有该硬编码名称的文件,以便人们可以复制并运行它,而不会出现任何编译错误。此外,您还没有回答第一个问题:使用子目录进行常规 zip 解包(因此:没有密码)是否可以正常工作?
  • 老实说,我不知道该怎么做。我只喜欢 Android 开发,而一个 Android 项目会因为所有的样板而大得像地狱,以至于它比这更不清晰。常规 Java 对我来说已经很长了。不,我确实回答了这个问题:它有效。请再读一遍:“如果没有密码保护,这可以工作”

标签: java zip4j


【解决方案1】:

所以,我遇到了两个不同的问题:

在我的主代码中,我忘记在将它提供给 zip4j 一次后创建一个新的 InputStream(哎呀)。

但是,生成一个最小的示例,我使用 Ark 创建的受密码保护的 zip 文件 https://github.com/srikanth-lingala/zip4j/issues/329 触发了一个完全不同的错误。

请记住(这是有道理的!),zip4j 会读取您提供给它的 InputStream,因此如果您读取它以查看密码是否正确,之后您需要给它一个新的 InputStream,否则您将找不到任何文件了!

【讨论】:

    最近更新 更多