为什么zipinputstream.getnextentry()返回null?

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

我有一个加密的zip文件。解密后,我将得到一个包含zip内容的字节[]。但当我尝试使用bytearrayinputstream解压它时,zipinputstream.getnextentry()立即返回null。在调试过程中,我发现我的字节[]没有所需的本地文件头签名
静态长locsig=0x04034b50l;//”pk\003\004“
因此,zipinputstream.getnextentry()返回null。
但是,如果我将这些解密的字节写入一个文件,然后使用传递给zipinputstream()的fileinputstream(),那么一切都会按预期进行。下面是我当前的代码。有谁能建议一种不用先写入临时文件即可解压缩的方法吗?

byte[] data = AESUtil.decryptInputStream(...);
    ByteArrayInputStream bis = new ByteArrayInputStream(data);
    ZipInputStream stream = new ZipInputStream(bis);
    ZipEntry entry;
    while ((entry = stream.getNextEntry()) != null) {
        ...
    }
bprjcwpo

bprjcwpo1#

我得出的结论是zipinputstream不够灵活。当我用ApacheCommons的压缩类替换上面的代码时,一切都正常。下面是使用该库和相同字节数组的工作实现:

byte[] data = AESUtil.decryptInputStream(...);
SeekableInMemoryByteChannel inMemoryByteChannel = new SeekableInMemoryByteChannel(data);
ZipFile zipFile = new ZipFile(inMemoryByteChannel);
Iterator<ZipArchiveEntry> iterator = = zipFile.getEntriesInPhysicalOrder().asIterator();
while (iterator.hasNext()) {
    ...
}

相关问题