以编程方式从7zip存档中提取单个特定文件-Java-Linux

托比亚斯·维特(Tobias Wittur)

非常感谢您在以下情况下的投入。

要求:-我有一个包含数千个文件的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做到这一点的方法?

谢谢

亲切的问候,

托比

本杰明·洛克(Benjamin Close)

遗憾的是,该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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章