我正在尝试对通过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_文件!如果没有密码保护,则此选项有效)
有人知道我做错了什么吗?
1条答案
按热度按时间km0tfn4u1#
结果,我遇到了两个不同的问题:
在我的主代码中,我忘记了在向zip4j提供一次输入流之后创建一个新的输入流(oops)。
然而,在生成一个简单的示例时,我使用ark创建的受密码保护的zip文件触发了一个完全不同的错误https://github.com/srikanth-lingala/zip4j/issues/329.
记住(这是有道理的!),zip4j读取您输入的输入流,因此如果您读取它以查看密码是否正确,您需要在之后为它提供一个新的输入流,否则您将无法再找到任何文件!