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

Java 从包含大量文件的zip文件中提取1个文件的最快方法是什么?,java,unzip,compression,Java,Unzip,Compression,我试过这个包裹,它太慢了 然后我发现了,但是他们也缺少一些东西。 LZMA SDK没有提供关于如何使用的文档/教程,这非常令人沮丧。没有javadoc 虽然7z jbinding并没有提供一种只提取1个文件的简单方法,但它只提供了提取zip文件所有内容的方法。此外,它没有提供一种方法来指定放置解压缩文件的位置 有什么想法吗?你用java.util.zip编写的代码是什么样子的?你要处理多大的zip文件 我能够在大约一秒钟内从一个200 MB的zip文件中提取出一个4 MB的条目,其中包含1800

我试过这个包裹,它太慢了

然后我发现了,但是他们也缺少一些东西。

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

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


有什么想法吗?

你用
java.util.zip
编写的代码是什么样子的?你要处理多大的zip文件

我能够在大约一秒钟内从一个200 MB的zip文件中提取出一个4 MB的条目,其中包含1800个条目:

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;
    }
}
使用a而不是a

尽管文档中没有指出这一点(它在
JarFile
的文档中),但应该使用随机访问文件操作来读取文件。由于ZIPfile在已知位置包含一个目录,这意味着查找特定文件所需的IO要少得多

一些警告:据我所知,Sun实现使用内存映射文件。这意味着您的虚拟地址空间必须足够大,以容纳文件以及JVM中的所有其他内容。这可能是32位服务器的问题。另一方面,它可能足够聪明,可以避免32位上的内存映射,或者只映射目录上的内存映射;我还没试过


另外,如果您使用多个文件,请确保使用
try
/
finally
以确保文件在使用后关闭。

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

从zip文件
test.zip
中提取
META-INF/MANIFEST.MF
的一个简短示例:

// 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());
}

我们正在做一个供外人使用的web应用……我们说的是每秒20个请求。我们已经检查过,使用java.util.zip解压文件的速度在0.5s到2s之间。这太慢了。我想你说的是每秒20个请求,需要一个zip文件。为什么不提前完全解压这些文件并直接从文件系统中提供它们呢?如果在FileInputStream和ZipInputStream之间有一个BufferedInputStream,那么您的代码会更快。另外,您不应该在最后执行zin.close()吗?是否不需要zin.closeEntry()?工作正常,而且速度非常快。。。这应该是公认的答案(假设Java 7或更高版本)。