Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解压缩文件真的很慢_Java_Performance_Zip - Fatal编程技术网

Java 解压缩文件真的很慢

Java 解压缩文件真的很慢,java,performance,zip,Java,Performance,Zip,我编写了一些代码,可以检索zip文件并将其解压缩到directoy中。zip文件包含两个文件夹,根据每个文件所在的文件夹,它将解压缩到该目录的文件夹中 但是,该代码需要非常长的时间才能运行大约10分钟。尽管如此,每个文件夹包含近1000个文件,zip文件的总大小为5000kb。我认为它运行得很慢,因为每次进入循环时我都在创建FileOutputStream和InputStream。但是,我需要这样做,因为在从zip文件读取文件之前,我不知道文件的输出目录。找出它在哪个文件夹里 有什么建议吗 /*

我编写了一些代码,可以检索zip文件并将其解压缩到directoy中。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();
    }
}

首先尝试将文件加载到内存中,每次加载X mb,然后创建文件的IO流。

您正在一次复制一个字节的文件

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

您可以尝试使用Apaches org.apache.commons.io.IOUtils.copy,因为它将分块复制,并使用NIO和其他改进。你可以在公钥Io.jar

找到它。你可能想考虑一下:不确定我是否知道你的意思,但是zip文件被下载到一个临时位置,然后在解压缩文件时使用该文件。下载zip getFileURL方法不需要很长时间,我在想,也许你可以一次解压一大块文件,然后将该大块写入文件。这样你就不必为每个文件创建FileOutputStream了。谢谢,我增加了文件的大小,现在它以闪电般的速度完成了!你是怎么增加尺寸的?