解压缩受密码保护的zipinputstream目录中的文件

d4so4syb  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(594)

我正在尝试对通过zipinputstream接收的受密码保护的zip文件使用zip4j。它大部分工作正常,但我有一个带有子目录的.zip文件,当我在上面循环时,我只看到一个目录。
最简单的例子:
创建一个受密码保护的zip,其中有一个目录和一个文件(为了简单起见,我选择了密码“password”)。您的拉链将如下所示:

$ 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_文件!如果没有密码保护,则此选项有效)
有人知道我做错了什么吗?

km0tfn4u

km0tfn4u1#

结果,我遇到了两个不同的问题:
在我的主代码中,我忘记了在向zip4j提供一次输入流之后创建一个新的输入流(oops)。
然而,在生成一个简单的示例时,我使用ark创建的受密码保护的zip文件触发了一个完全不同的错误https://github.com/srikanth-lingala/zip4j/issues/329.
记住(这是有道理的!),zip4j读取您输入的输入流,因此如果您读取它以查看密码是否正确,您需要在之后为它提供一个新的输入流,否则您将无法再找到任何文件!

相关问题