为什么 ZipInputStream.getNextEntry() 返回 null?

问题描述

我有一个 AES 加密的 zip 文件。解密后,我留下了一个包含 zip 内容的字节 []。但是当我尝试解压缩它时,使用 ByteArrayInputStream,ZipInputStream.getNextEntry() 立即返回 null。调试,我看到我的 byte[] 没有一个必需的本地文件头签名是

静态长 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) {
        ...
    }

解决方法

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

class TimerManager: ObservableObject {
    @Published var secondsElapsed = 0.0
    @Published var isRunning = false
    var timer = Timer()
    
    func start() {
        isRunning = true
        timer = Timer.scheduledTimer(withTimeInterval: 0.01,repeats: true) { timer in
            self.secondsElapsed += 0.01
        }
    }
    
    func stop() {
        timer.invalidate()
        isRunning = false
    }
    
    func reset() {
        secondsElapsed = 0
    }
}