2012-03-30 11 views
21

Se apro un file zip grande (250 MB) tramite la classe ZipFile e provo a leggere le voci. Funziona bene su 2.x nell'emulatore e nell'hardware reale. Se utilizzo il codice esatto sul mio tablet (Asus Transformer in esecuzione 4.0.3) o l'emulatore (3.2), non riesco a leggere nessuna voce. La funzione size() della classe ZipFile restituisce sempre zero e ZipFile non restituisce alcuna voce zip. Anche l'app per zip che viene fornita con la ROM sul mio tablet non può leggere alcuna voce. Il file zip non è danneggiato. L'ho controllato.Classe Android 3.x + Java ZipFile - Impossibile leggere ZipEntries da file di grandi dimensioni

Il codice da leggere da ZipFile funziona bene su tutte le versioni con file zip più piccoli. Cosa è cambiato tra 2.xe 3.x/4.x ??

My Testfile è il C64Music.zip della raccolta Sid HighVoltage. Contiene oltre 40.000 file ed è di circa 250 MB.

Non ho idea di dove guardare.

+0

Hai provato a leggere altri file zip sull'asus o sull'emulatore in esecuzione 3.x/4.x? Il problema è solo con questo file zip? –

+0

Stai ingoiando qualche eccezione? In caso contrario, getName() restituisce il nome del file zip? (Test semplice, ma potrebbe rivelarsi qualcosa di sorprendente). Ottieni risultati diversi se apri lo zip con o senza il flag OPEN_READ? –

+0

Non sono sicuro, potresti provare con 'JarFile'? ... –

risposta

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

Sono state apportate molte modifiche in 3.x/4.x per impedire l'abuso del thread dell'interfaccia utente. Pertanto, è possibile che la tua app si arresti in modo anomalo perché non stai scaricando la costosa operazione di I/O su disco su un numero Thread separato.

2

Questo è un problema noto con l'implementazione ZipFile Android:

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

Fondamentalmente zip file solo supportano fino a 65k voci. Esiste una versione estesa del formato di file zip chiamato Zip64, che supporta un numero maggiore di voci. Purtroppo ZipFile su Android non può leggere Zip64. Probabilmente troverai che il file C64Music.zip è nel formato Zip64

Una soluzione è utilizzare la libreria Compress di Apache Commons anziché l'implementazione nativa. La loro versione di ZipFile supporta Zip64: http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipFile.html

Problemi correlati