gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:23 37 4
gpt4 key购买 nike

非常感谢您对以下场景的意见。

要求:- 我有一个 7zip 存档文件,里面有几千个文件- 我有一个在 linux 上运行的 java 应用程序,需要从 7 zip 文件中检索单个文件

  • 我想通过文件的路径(例如 my7zFile.7z/file1.pdf)从存档中检索文件,而不必遍历存档中的所有文件并比较文件名。

  • 我想避免在运行搜索之前从存档中提取所有文件(未压缩的存档有几个 TB)。

我查看了 7zip Java 绑定(bind)——特别是 IInArchive 类,唯一的提取方法似乎是通过文件索引而不是通过文件名工作:

http://sevenzipjbind.sourceforge.net/javadoc/net/sf/sevenzipjbinding/IInArchive.html

您是否知道任何其他库可以帮助我处理这个用例,或者我是否忽略了使用 7zip jbinding 执行此操作的方法?

谢谢

亲切的问候,

托比

最佳答案

遗憾的是,API 似乎无法满足您的所有要求。为了提取单个文件,您似乎需要遍历存档索引。存档的简化界面使这更容易:

ISimpleInArchive 接口(interface)提供:

ISimpleInArchiveItem[]  getArchiveItems()  

允许您检索存档中的项目列表。ISimpleInArchiveItem 接口(interface)提供了方法:

java.lang.String    getPath()

因此您可以遍历比较路径上的 archiveItems。当然,这违反了您的要求。

但是,请注意,这会遍历索引表并且在请求之前不会提取文件。一旦你有了你的元素,你就可以使用:

ExtractOperationResult  extractSlow(ISequentialOutStream SequentialOutStream) 

在你找到的元素上实际提取它。

查看 7z file format (注意这不是 7zip 的官方网站), header 信息都在文件的末尾,文件开头的 Signature header 给出了 header 信息开头的偏移量。因此,如果 SevenZip 绑定(bind)编写得很好,您的搜索最多将读取文件的开头 (SignatureHeader) 以找到 HeaderInfo 部分的偏移量,然后遍历 HeaderInfo 部分以构建 getArchiveItems() 中所需的文件列表.只有在您拥有所需的项目后,它才会移回您要提取的文件的实际流的索引(最有可能在您调用 extractSlow 时)。

因此,虽然并未满足您的所有要求,但所需的搜索/比较开销仅限于搜索存档的 header 信息。

关于java - 以编程方式从 7zip 存档中提取单个特定文件 - Java - Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41111476/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com