2012-07-23 13 views
12

Sto leggendo i file da un file ZIP che si trova nella cartella delle risorse Android utilizzando ZipInputStream: funziona, ma è molto lento, in quanto deve leggerlo in sequenza utilizzando getNextEntry() e ci sono molti fileLettura di file da un file ZIP nella cartella delle risorse Android

Se copio il file ZIP sulla scheda SD, la lettura è molto veloce quando si utilizza ZipFile.getEntry, ma non ho trovato il modo di utilizzare ZipFile con il file di asset!

C'è un modo per accedere allo ZIP nella cartella delle risorse in modo rapido? O devo davvero copiare lo ZIP sulla scheda SD?

(nel caso in cui qualcuno si chiedesse perché sto facendo questo: l'app è più grande di 50 MB, quindi per averlo nel Play Store devo usare gli APK di espansione, tuttavia, come questa app dovrebbe anche essere messo in Amazon App Store, devo usare un'altra versione per questo, come Amazon non supporta APK di espansione, naturalmente ... Ho pensato che l'accesso a un file ZIP in due posizioni diverse sarebbe un modo semplice per gestire questo, ma ahimè ...)

risposta

2

È possibile creare uno ZipInputStream nel seguente modo:

ZipInputStream zipIs = new ZipInputStream(context.getResources().openRawResource(your.package.com.R.raw.filename)); 
ZipEntry ze = null; 

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

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

      byte[] buffer = new byte[1024]; 
      int length = 0; 

      while ((length = zipIs.read(buffer))>0) { 
      fout.write(buffer, 0, length); 
      } 
      zipIs .closeEntry(); 
      fout.close(); 
     } 
     zipIs .close(); 
+0

Grazie, ma come ho scritto, ho già usare un 'ZipInputStream', ma cercando nel ZIP utilizzando' getNextEntry() 'è semplicemente troppo lento! – hdort

+0

Leggete il file con un buffer? Ho fornito il mio codice con un esempio. Funziona piuttosto bene per me. – Slickelito

+1

Non è l'estrazione che è lento, sta cercando il file corretto nel file zip. C'è qualcosa di simile a 'ZipFile.getEntry (filename)' per 'ZipInputStream'? – hdort

2

è possibile memorizzare i file non compressi direttamente in attività (ad esempio decomprimere il zip in risorse/cartella). In questo modo, puoi accedere direttamente ai file e questi verranno comunque compressi durante la creazione dell'APK.

4

questo funziona per me:

private void loadzip(String folder, InputStream inputStream) throws IOException 
{ 
    ZipInputStream zipIs = new ZipInputStream(inputStream); 
    ZipEntry ze = null; 

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

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

       byte[] buffer = new byte[1024]; 
       int length = 0; 

       while ((length = zipIs.read(buffer))>0) { 
       fout.write(buffer, 0, length); 
       } 
       zipIs.closeEntry(); 
       fout.close(); 
      } 
      zipIs.close(); 
} 
Problemi correlati