从包含大量文件的zip文件中提取1文件的最快方法是什么?

2022-09-05 00:38:53

我尝试了java.util.zip包,它太慢了。

然后我发现了LZMA SDK7z jbinding,但它们也缺少一些东西。

LZMA SDK不提供一种如何使用的文档/教程,这非常令人沮丧。没有 javadoc。

虽然7z jbinding没有提供一种简单的方法来只提取1个文件,但是,它只提供了提取zip文件所有内容的方法。此外,它没有提供一种方法来指定放置解压缩文件的位置。

有什么想法吗?


答案 1

您的代码是什么样子的,您正在处理的zip文件有多大?java.util.zip

我能够在大约一秒钟内从具有1,800个条目的200MB zip文件中提取出一个4MB的条目:

OutputStream out = new FileOutputStream("your.file");
FileInputStream fin = new FileInputStream("your.zip");
BufferedInputStream bin = new BufferedInputStream(fin);
ZipInputStream zin = new ZipInputStream(bin);
ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
    if (ze.getName().equals("your.file")) {
        byte[] buffer = new byte[8192];
        int len;
        while ((len = zin.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        out.close();
        break;
    }
}

答案 2

我还没有对速度进行基准测试,但是使用java 7或更高版本,我提取了一个文件,如下所示。
我想它比ZipFile API更快:

从 zip 文件中提取的简短示例:META-INF/MANIFEST.MFtest.zip

// file to extract from zip file
String file = "MANIFEST.MF";
// location to extract the file to
File outputLocation = new File("D:/temp/", file);
// path to the zip file
Path zipFile = Paths.get("D:/temp/test.zip");

// load zip file as filesystem
try (FileSystem fileSystem = FileSystems.newFileSystem(zipFile)) {
    // copy file from zip file to output location
    Path source = fileSystem.getPath("META-INF/" + file);
    Files.copy(source, outputLocation.toPath());
}

推荐