我有一个字节数组中的 zip 文件的内容。该文件包含许多条目(通常约为 12 个),但我只关心其中三个。
我想以某种方式将其放入 ZipFile
对象中,这样我就可以使用 ZipFile.getEntry
将这三个特定的 ZipEntry
取出。我愿意使用 ZipFile
之外的其他东西,它具有类似的按名称查找方法,如 getEntry
。
我的初步调查表明我运气不好。 ZipFile
需要文件子系统中有一个真实的文件(我不能也不想访问),因此我无法从这里到达那里,并且除了 ZipFile
之外,没有其他方法可以允许按名称提取特定条目;但我想检查一下。在 C# 和 Python 等语言中,这非常简单(在 C# 中,我从字节数组到 MemoryStream
再到 ZipArchive
;在 Python 中,我只是将其包装在 StringIO
中并像文件一样对待),所以我想确保我没有遗漏一些明显的东西。
我的 B 计划是使用 ZipInputStream
并重复调用 getNextEntry
来遍历所有十多个条目,并丢弃除我关心的三个之外的所有条目,但这对我来说味道很糟糕。
最佳答案
可以为任何 InputStream
实例化 ZipInputStream
...包括 ByteArrayInputStream
。
除此之外,如果您坚持使用 Java SE 类,那么您就不走运了。
问题的根源(从 API 设计的角度来看)是 ZipFile 是在 native 代码中实现的功能的包装器。 native 代码为自己打开输入流,并使用 native 文件名/路径名。
native ZIP 实现以这种方式工作的主要原因是 JVM 需要从 ZIP 文件加载代码作为 Bootstrap 的一部分。这发生在 native 实现加载诸如 InputStream
之类的类之前。事实上,它必须如此。
有许多第三方库。首先阅读此问答 - What is a good Java library to zip/unzip files?
关于Java:有什么方法可以从字节数组中获取 ZipFile (或任何具有直接 getEntry 方法的内容)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28248012/