java - 解压文件真的很慢

标签 java performance zip

我编写了一些代码来检索 zip 文件并将其解压缩到目录中。 zip 文件包含两个文件夹,根据每个文件所在的文件夹,将其解压缩到该目录的文件夹中。

但是,代码的运行时间非常长(大约 10 分钟)。不过,每个文件夹包含近 1000 个文件,zip 文件的总大小为 5000kb。我认为它运行得很慢,因为每次进入循环时我都会创建 FileOutputStream 和 InputStream。但是,我需要这样做,因为在从 zip 文件中读取文件之前我不知道文件的输出目录。 (即找出它位于哪个文件夹中)

有什么建议吗?

/**
 * Retrieves and unzips a file from its URL
 */
public void retrieveFiles(String URL) {

    //Retrieve file from URL
    File zip = new File(getFile(URL));
    zip.mkdirs();

    try {
        //Create .zip file from file directory
        ZipFile zipFile = new ZipFile(zip);
        Enumeration<? extends ZipEntry> enumeration = zipFile.entries();

        //While zip file contains elements, get the next zipped file
        while (enumeration.hasMoreElements()) {
            ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();

            //Ignore folders and other zip files
            if(!zipEntry.isDirectory() && !zipEntry.getName().endsWith(".zip")){

                //Find directory and filename for new unzipped file
                String directory = getURL(zipEntry.getName());
                String fileName = getFileName(zipEntry.getName());
                String fullDirectory = createDirectory(directory, fileName);

                //Unzip file and store in directory
                System.out.println("Unzipping file: " + fileName);
                FileOutputStream fout = new FileOutputStream(fullDirectory);
                InputStream in = zipFile.getInputStream(zipEntry);
                for (int c = in.read(); c != -1; c = in.read()) {
                    fout.write(c);
                }
                zipFile.getInputStream(zipEntry).close();
                in.close();
                fout.close();
            }
        }
        zipFile.close();
        System.out.println("Unzipping complete!");

        zip.delete();

    } catch (IOException e) {
        System.out.println("Unzip failed");
        e.printStackTrace();
    }
}

最佳答案

您一次复制一个字节

for (int c = in.read(); c != -1; c = in.read())
    fout.write(c);
}

您可以尝试使用 Apache org.apache.commons.io.IOUtils.copy(),因为这会分块复制并使用 NIO 和其他改进。您可以在 commons-io.jar 中找到它

关于java - 解压文件真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7271339/

相关文章:

python - 在 python 中加速欧拉数值方案

MySQL并不总是使用索引

java - 如何将 OutputStream 转换为字符串?

java - 读取二进制图像

java - 在分配给 null 之前检查变量是否为 null?

c# - GZipStream zip文件无效或损坏

java - 关闭 ZipOutputStream

java - Mac 上的 java.util.zip.*(提取)问题

java - ImageIcon 和按钮上的图像的问题 - JFrame

java - 如何确定时间复杂度是 O(m + n) 还是 O(Math.max(m, n))