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

Programatically Extract Single Specific File From 7zip Archive - Java - Linux

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

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

中检索单个文件

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

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

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

谢谢

亲切的问候,

托比

有一次我写了一个代码来读取一个 zip 文件中的所有文件和文件夹。我在 zip 文件中有一个很长的文件(文本)/文件夹层次结构。我不确定这是否对您有帮助。我正在分享代码的框架。

import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

ZipFile zipFile = new ZipFile(filepath); // filepath of the zip file
Enumeration<? extends ZipEntry> entries = zipFile.entries();

while (entries.hasMoreElements()) {
    ZipEntry entry = entries.nextElement();
    if (entry.isDirectory()) { // found directory inside the zipFile
        // write your code here
    } else {
        InputStream stream = zipFile.getInputStream(entry);
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        // write your code to read the content of the file
    }
}

您可以修改代码以在 zip 中找到您想要的文件。但我认为您不能直接访问该文件,而必须遍历 zip 存档的所有路径。 请注意,ZipFile 以 DFS(深度优先搜索)方式遍历压缩文件中的所有文件和文件夹。你会在网上找到详细的相关例子。

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

ISimpleInArchive接口提供:

ISimpleInArchiveItem[]  getArchiveItems()  

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

java.lang.String    getPath()

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

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

ExtractOperationResult  extractSlow(ISequentialOutStream SequentialOutStream) 

在您找到的项目上实际提取它。

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

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