非常感谢您在以下情况下的投入。
要求:-我有一个包含数千个文件的7zip存档文件-我有一个在Linux上运行的Java应用程序,需要从7个zip文件中检索单个文件
我想通过存档路径(例如my7zFile.7z / file1.pdf)从存档中检索文件,而不必遍历存档中的所有文件并比较文件名。
我想避免在运行搜索之前必须从存档中提取所有文件(未压缩的存档数TB)。
我查看了7zip Java Binding-特别是IInArchive类,唯一的提取方法似乎通过文件索引而不是文件名起作用:
http://sevenzipjbind.sourceforge.net/javadoc/net/sf/sevenzipjbinding/IInArchive.html
您是否知道其他可以帮助我解决此用例的库,还是我忽略了使用7zip jbinding做到这一点的方法?
谢谢
亲切的问候,
托比
遗憾的是,该API似乎不足以满足您的所有要求。为了提取单个文件,您似乎需要遍历存档索引。简化的存档界面使此操作变得更加容易:
该ISimpleInArchive
界面提供:
ISimpleInArchiveItem[] getArchiveItems()
允许您检索存档中的项目列表。该ISimpleInArchiveItem
界面提供了以下方法:
java.lang.String getPath()
因此,您可以在路径上比较archiveItems。当然,这违反了您的要求。
但是,请注意,这会遍历索引表,并且在请求之前不会提取文件。获得物品后,您可以使用:
ExtractOperationResult extractSlow(ISequentialOutStream SequentialOutStream)
在您发现实际上可以将其提取的项目上。
查看7z文件格式(请注意,这不是7zip的官方网站),标头信息全部位于文件的末尾,而Signature标头位于文件的开头,提供了标头信息开头的偏移量。因此,只要SevenZip绑定写得很好,您的搜索最多将读取文件的开头(SignatureHeader)以找到HeaderInfo部分的偏移量,然后遍历HeaderInfo部分以建立getArchiveItems()中所需的文件列表。只有获得所需的项目后,它才会移回到要提取的文件的实际流的索引中(最有可能在调用extractSlow时)。
因此,虽然不能满足您的所有要求,但所需的搜索/比较开销仅限于仅搜索归档文件的标头信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句