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

标签 java arrays byte zip

我有一个字节数组中的 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/

相关文章:

java - 用另一个字符串替换文件中的字符串

java - 在 log4j2 中创建惰性消息

performance - 访问一个字节比访问一个比特更快吗?为什么?

java - Spring 配置文件中的 Liquibase 文件路径

java - 遍历实例变量的 ArrayList

Python:获取对字符串数组进行排序以匹配另一个字符串数组的索引

带有十六进制输入的 Bash sha1

java - 如果超出 Java 中变量的限制会发生什么?

java - 需要 java/file IO 方面的帮助

python - numpy 数组的列表索引中的多个切片