2012-07-23 13 views
12

ZipInputStream kullanarak Android varlıklar klasörümde bulunan bir ZIP dosyasındaki dosyaları okuyorum: işe yarıyor, ancak getNextEntry()'u kullanarak ardışık olarak okumak zorunda olduğu için gerçekten yavaştır ve oldukça fazla dosya var.Android öğeler klasörünüzdeki bir ZIP dosyasındaki dosyaları okuma

ZIP dosyasını SD kartına kopyalarsam, ZipFile.getEntry kullanırken okuma gerçekten hızlıdır, ancak varlık dosyasıyla ZipFile'u kullanmanın bir yolunu bulamadım!

Öğe klasöründeki ZIP'e hızlı bir şekilde erişmenin herhangi bir yolu var mı? Yoksa ZIP’i SD karta kopyalamak zorunda mıyım?

(BTW, herkes bunu neden yaptığımı merak ediyorsa: uygulama 50 MB'tan büyüktür, bu yüzden Play Store'dan alabilmek için Genişleme APK'larını kullanmam gerekir, ancak bu uygulama aynı zamanda Amazon App Store'a konabilirim, bunun için başka bir versiyon kullanmalıyım, Amazon genişleme APK'larını desteklemiyor, doğal olarak ... İki farklı yerde bir ZIP dosyasına erişmenin bu işi halletmenin kolay bir yolu olacağını düşündüm. ama ne yazık ki ...) aşağıdaki şekilde bir ZipInputStream oluşturabilir

cevap

2

:

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

Teşekkür ama yazdığı gibi, ben zaten bir 'ZipInputStream' kullanın, ancak kullanarak ZIP arayan' getNextEntry() 'sadece yol çok yavaş! – hdort

+0

Dosyayı bir arabelleğe okudunuz mu? Kodumu bir örnek verdim. Benim için gayet iyi çalışıyor. – Slickelito

+1

Bu yavaş olan ayıklama değil, zip dosyasında doğru dosya için arıyor. ZipInputStream' için ZipFile.getEntry (dosya adı) 'benzeri bir şey var mı? – hdort

2

Sen varlık doğrudan sıkıştırılmamış dosyaları saklayabilir (yani açmak varlıklar/klasörlere sıkıştır). Bu şekilde, doğrudan dosyalara erişebilir ve APK'yı oluşturduğunuzda yine de sıkıştırılmış olacaksınız.

4

Bu benim için çalışıyor:

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(); 
}