我在一个字节数组中有一个zip文件的内容。该文件包含许多条目(通常约为12个),但我只关心其中的三个。
我想以某种方式将其转换为ZipFile
对象,因此我可以使用ZipEntry
将这些特定的三个ZipFile.getEntry
拉出来。我愿意使用ZipFile
之外的其他内容,这些内容具有类似getEntry
的查找方法。
我的初步调查表明我运气不好。 ZipFile
需要文件子系统中的真实文件(我不能也不想访问),所以我不能从这里到达那里,除ZipFile
之外不存在允许提取特定文件的方法条目名称;但我想检查一下。在C#和Python等语言中,这非常简单(在C#中我从字节数组转到MemoryStream
到ZipArchive
;在Python中我只是将它包装在StringIO
中并像文件一样对待)所以我想确保我没有遗漏任何明显的东西。
我的B计划是使用ZipInputStream
并重复拨打getNextEntry
来完成所有十几个参赛作品,除了我关心的三个以外,所有这些都扔掉了,但这对我来说闻起来很糟糕
答案 0 :(得分:1)
可以为任何ZipInputStream
实例化InputStream
...包括ByteArrayInputStream
。
除此之外,如果你坚持使用Java SE类,那你就不走运了。
问题的根源(从API设计的角度来看)是ZipFile是在本机代码中实现的功能的包装器。本机代码为自己打开输入流,它使用本机文件名/路径名。
以这种方式工作的本机ZIP实现的主要原因是JVM需要从ZIP文件加载代码作为引导程序的一部分。这种情况发生在之前本机实现已加载诸如InputStream
之类的类。确实,它必须。
有许多第三方图书馆。首先阅读此Q& A - What is a good Java library to zip/unzip files?