2011-09-01 45 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