2012-03-30 58 views
21

如果我通過ZipFile類打開一個大的zip文件(250MB)並嘗試讀取條目。這在模擬器和真實硬件中的2.x上運行良好。如果我使用我的平板電腦上的確切代碼(運行4.0.3的Asus Transformer)或模擬器(3.2),我無法讀取任何條目。 ZipFile類的size()函數始終返回零,並且ZipFile不返回任何zip條目。即使我平板電腦上的ROM附帶的zip應用程序也無法讀取任何條目。該zip文件沒有損壞。我檢查了它。Android 3.x + Java ZipFile類 - 無法從大文件讀取ZipEntries

從ZipFile中讀取的代碼適用於所有版本較小的zip文件。 2.x和3.x/4.x之間有什麼變化?

我的測試文件是來自HighVoltage Sid Collection的C64Music.zip。它包含超過40,000個文件,大約250MB。

我沒有線索在哪裏看。

+0

您是否嘗試閱讀運行3.x/4.x的Asus或模擬器上的其他zip文件?這個zip文件只有問題嗎? – 2012-05-24 09:11:40

+0

您是否吞嚥任何異常?如果沒有,getName()是否返回zipfile的名稱? (簡單的測試,但可能會出現令人驚訝的事情)。 如果您使用或不使用OPEN_READ標誌打開zip,您會得到不同的結果嗎? – 2012-07-03 16:41:44

+0

我不確定,你可以嘗試用'JarFile'嗎?... – 2012-07-10 13:52:04

回答

0
public class Compress { 

    private static final int BUFFER = 2048; 
    private String[] _files; 
    private String _zipFile; 
    public Compress(String[] files, String zipFile) { 
    _files = files; 
    _zipFile = zipFile; 
    } 
    public void zip() { 
    try { 
     BufferedInputStream origin = null; 
     FileOutputStream dest = new FileOutputStream(_zipFile); 
     ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); 
     byte data[] = new byte[BUFFER]; 
     for(int i=0; i < _files.length; i++) { 
     Log.v("Compress", "Adding: " + _files[i]); 
     FileInputStream fi = new FileInputStream(_files[i]); 
     origin = new BufferedInputStream(fi, BUFFER); 
     ZipEntry entry = new ZipEntry(_files[i].substring(_files[i].lastIndexOf("/") + 1)); 
     out.putNextEntry(entry); 
     int count; 
     while ((count = origin.read(data, 0, BUFFER)) != -1) { 
      out.write(data, 0, count); 
     } 
     origin.close(); 
     } 

     out.close(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

    } 

} 

Call Compress like given below where you want to zip a file :---- 

String zipFilePath = "fileName.zip"; 
File zipFile = new File(zipFilePath); 
String[] files = new String[] {"/sdcard/fileName"}; 
if(!zipFile.exists()){ 
    new Compress(files, zipFilePath).zip(); 
    } 
0

在3.x/4.x中進行了很多更改以防止對UI線程的濫用。因此,您的應用程序可能會崩潰,因爲您沒有將昂貴的磁盤I/O操作卸載到單獨的Thread

2

這是一個已知的問題與Android的ZipFile實現:

http://code.google.com/p/android/issues/detail?id=23207

基本上zip文件只支持最多65K條目。有一個名爲Zip64的zip文件格式的擴展版本,它支持大量的條目。不幸的是,Zip上的ZipFile無法讀取Zip64。您可能會發現C64Music.zip文件爲Zip64格式

解決方法是使用Apache Commons Compress庫而不是本機實現。他們的ZipFile版本支持Zip64:http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipFile.html