2011-09-01 190 views
2

我已经写了一些代码来检索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(); 
    } 
} 
+0

你不妨考虑一下http://codereview.stackexchange.com/ –

+0

另见:[java.util.zip - 重新创建目录结构](http:// stackoverflow .com/questions/1399126) – McDowell

回答

5

你在同一时间将文件复制一个字节

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

你可以尝试使用阿帕奇org.apache.commons.io.IOUtils.copy(),因为这将在块复制和使用NIO和其他改进。你可以在commons-io.jar找到它

+0

谢谢,我增加了尺寸,现在它在闪电般的速度! – Craig

+0

你是如何增加尺寸的? –

0

尝试加载文件加载到内存第一,在任何你找到合适的,然后创建IO流文件中,一次X MB。

+0

不知道我是否知道你的意思,但是zip文件被下载到一个临时位置,然后在解压文件时使用该文件。下载zip文件并不需要很长时间(getFile(URL)方法) – Craig

+0

我在想,也许你一次可以将文件解压缩成一个大块,然后把这个块写入文件。这样你就不必为每个文件创建一个FileOutputStream。 – WaelJ