Java:有什么方法可以从字节数组中获取 ZipFile(或任何使用直接 getEntry 方法的方法)?

Java: any way to get a ZipFile (or anything with a direct getEntry method) from a byte array?

我在一个字节数组中有一个 zip 文件的内容。该文件包含许多条目(通常约为 12 个),但我只关心其中三个。

我想以某种方式将它放入 ZipFile 对象中,这样我就可以使用 ZipFile.getEntry 将这三个特定的 ZipEntry 拉出来。我愿意使用 ZipFile 以外的东西,它具有类似的按名称查找方法,例如 getEntry.

我的初步调查表明我运气不好。 ZipFile 需要文件子系统中的真实文件(我不能也不想访问)所以我不能从这里到达那里,除了 ZipFile 之外没有其他方法可以提取特定的按名称输入;但我想检查一下。在 C# 和 Python 等语言中,这非常简单(在 C# 中,我从字节数组到 MemoryStream 再到 ZipArchive;在 Python 中,我只是将它包装在 StringIO 并像文件一样对待),所以我想确保我没有遗漏一些明显的东西。

我的 B 计划是使用 ZipInputStream 并重复调用 getNextEntry 来检查所有十几个条目,并丢弃除我关心的三个条目之外的所有条目,但这闻起来很糟糕对我来说。

A ZipInputStream 可以实例化为任何 InputStream ... 包括 ByteArrayInputStream.

除此之外你运气不好......如果你坚持使用 Java SE 类.

问题的根源(从 API 设计角度来看)是 ZipFile 是在本机代码中实现的功能的包装器。本机代码为自己打开输入流,并使用本机文件名/路径名。

本机 ZIP 实现以这种方式工作的主要原因是 JVM 需要从 ZIP 文件加载代码作为 bootstrap 过程的一部分。这发生在之前 本机实现已加载类,例如InputStream。确实,它必须。

有许多第 3 方库。从阅读此问答开始 - What is a good Java library to zip/unzip files?