2013-01-08 45 views
7

要解壓縮zip文件我用從包java.util.zip *類由闖民宅this,它工作正常不過解壓40MB的文件需要59秒。當我試圖在iPhone的項目同一個zip文件(我們正在開發應用兩個平臺 - Android電子& IPONE &有功能解壓壓縮文件&保存未壓縮的內容到SD卡,Android或文檔目錄 - iPhone),僅需14秒。 iphone應用程序使用ziparchive如何解壓大zip文件讀寫到SD卡在更短的時間

所以我的問題是:

1,從上述實驗中它會清除解壓&文件的寫操作在Java中的SD卡會消耗更多的時間比iPhone應用程序的,所以我決定用C/C++級解壓&文件寫操作使用NDK。 這是正確的選擇嗎?

2.我已經在谷歌搜索,計算器&一些建議使用minizip,但沒有足夠的幫助如何在Android中使用minizip。 anyboday是否嘗試過android的minizip?

3.我也試過NDK開發的libz達到我的目標,因爲Libz是在NDK中添加的,但沒有得到如何使用它。有沒有人試過NDK中的libz?

4.是否有任何其他框架在Java或C/C++中解壓縮大型zip文件&在較短時間內將它們寫入SDCARD?

請幫幫我。

這裏是我的Java解壓代碼:

public String unzip() { 

    String result; 

    try { 

     FileInputStream fin = new FileInputStream(this.filePath); 
     ZipInputStream zin = new ZipInputStream(fin); 
     ZipEntry ze = null; 

     while ((ze = zin.getNextEntry()) != null) { 

      Log.v("Unzip", "Unzipping " + ze.getName()); 

      if (ze.isDirectory()) { 
       _dirChecker(ze.getName()); 
      } else { 

       // Read 16 k at a time 
       byte[] buffer = new byte[16*1024]; 
       int read; 

       FileOutputStream fout = new FileOutputStream(this.location+ "/" + ze.getName()); 

       while ((read = zin.read(buffer)) != -1) 
       { 
        fout.write(buffer, 0, read); 
       } 


       zin.closeEntry(); 
       fout.close(); 
      } 

     } 

     zin.close(); 
     result = "success"; 

    } catch (Exception e) { 
     Log.e("unzip", "unzip", e); 
     result = "failure"; 
    } 

    return result; 
} 
+3

我懷疑它的SD卡部分。寫入SD卡可能非常慢,特別是在低端Android手機或便宜的SD卡上。解壓縮的時間也可能在低端Android手機上被懷疑,就像在舊iPhone手機上一樣,unziping將直接與處理器速度掛鉤。 –

+2

要測試@RyanPoolos有關SD卡的建議,請嘗試將文件解壓縮至應用程序內部存儲器(http://developer.android.com/reference/android/content/Context.html#getFilesDir(\)返回的目錄),然後看看時間是否與iPhone更接近。 java zip包應該相當高效。 –

+0

您也可以使用單獨的函數進行解壓縮和寫入,以查看哪個實際上在兩個平臺上花費時間。 –

回答

1

嘗試只寫40兆字節的文件到SD卡,並測量所花費的時間。 (幾乎)zip存檔支持庫的所有自由(或甚至支付)實現是基於相同的zlib代碼,其中所述解壓縮期間進行最處理速度。 Java代碼應該比原生代碼慢得多,所以我建議嘗試NDK解壓縮。另外,試圖用零壓縮級別解壓縮存檔將會給你一個猜測,解壓縮代碼需要多少時間,以及在數據複製上花費多少時間。

+0

你有關於如何在NDK級別實現解壓縮操作的任何鏈接或信息。我知道如何使用NDK,但不使用libz。 – sachin003

+0

對不起,沒有,沒有任何經驗。 –

4

所有解壓碼的zlib的最終結束。在Android核心庫中沒有「壓縮」壓縮的Java實現。

的唯一原因java.util.Zip應該比一個「原生」解壓縮速度較慢是如果文件I/O做得不好,例如有些東西正在使用真正的小緩衝查看從問題鏈接的代碼,這正是發生了什麼 - 它在單個字節上運行。

其中關於溶液的評論提供了使用4K緩衝器的貼劑。放下它,看看你的表現會發生什麼。

+0

感謝您的回覆,我使用的是16 K緩衝區大小,請參閱我的解壓縮代碼。 – sachin003

5

你爲什麼不試試這個code.It工作真棒

String zipname = "data.zip"; 
FileInputStream fis = new FileInputStream(zipname); 
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
ZipEntry entry; 

while ((entry = zis.getNextEntry()) != null) { 
    System.out.println("Unzipping: " + entry.getName()); 

    int size; 
    byte[] buffer = new byte[2048]; 

    FileOutputStream fos = new FileOutputStream(entry.getName()); 
    BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length); 

    while ((size = zis.read(buffer, 0, buffer.length)) != -1) { 
    bos.write(buffer, 0, size); 
    } 
    bos.flush(); 
    bos.close(); 
} 
zis.close(); 
fis.close(); 

}

0
public boolean unzip(String zipfilepath, String destinationdir) { 

      try { 
       FileInputStream fis = new FileInputStream(zipfilepath); 
       ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
       ZipEntry entry; 

       while ((entry = zis.getNextEntry()) != null) { 
        System.out.println("Unzipping: " + entry.getName()); 

        int size; 
        byte[] buffer = new byte[2048]; 

        FileOutputStream fos = new FileOutputStream(destinationdir+ "/" + entry.getName()); 
        BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length); 

        while ((size = zis.read(buffer, 0, buffer.length)) != -1) { 
        bos.write(buffer, 0, size); 
        } 
        bos.flush(); 
        bos.close(); 
       } 
       zis.close(); 
       fis.close(); 
       return true; 
       }catch(Exception e){ 
        return false; 
       } 
     } 



String zipfilepath = context.getFilesDir().getPath()+"/"+myfile.zip; 
String destinationdir = context.getFilesDir().getPath(); 


unzip(zipfilepath, destinationdir);