2012-03-30 5 views
21

यदि मैं ज़िपफाइल क्लास के माध्यम से एक बड़ी ज़िप फ़ाइल (250 एमबी) खोलता हूं और प्रविष्टियों को पढ़ने की कोशिश करता हूं। यह एमुलेटर और असली हार्डवेयर में 2.x पर ठीक काम करता है। अगर मैं अपने टैबलेट (एसस ट्रांसफार्मर 4.0.3 चल रहा है) या एमुलेटर (3.2) पर सटीक कुछ कोड का उपयोग करता हूं, तो मैं कोई प्रविष्टि नहीं पढ़ सकता। ज़िपफाइल क्लास का आकार() फ़ंक्शन हमेशा शून्य देता है और ज़िपफाइल किसी भी ज़िप प्रविष्टियों को वापस नहीं करता है। यहां तक ​​कि मेरे टैबलेट पर रोम के साथ आने वाला एक ज़िप ऐप भी कोई प्रविष्टि नहीं पढ़ सकता है। ज़िप फ़ाइल क्षतिग्रस्त नहीं है। मैंने इसे जाँचा था।एंड्रॉइड 3.x + जावा ज़िपफाइल क्लास - बड़ी फ़ाइलों से ज़िप्पेन्ट्री नहीं पढ़ सकता

ज़िपफाइल से पढ़ने के लिए कोड छोटे ज़िप फ़ाइलों के साथ सभी संस्करणों पर ठीक काम करता है। 2.x और 3.x/4.x के बीच क्या बदल गया है ??

मेरा टेस्टफ़ाइल हाईवॉल्टेज सिड संग्रह से C64Music.zip है। इसमें 40,000 से अधिक फाइलें हैं और लगभग 250 एमबी हैं।

मुझे कोई संकेत नहीं है कि कहां देखना है।

+0

क्या आपने अपने एसस या एमुलेटर पर 3.x/4.x चल रहे अन्य ज़िप फ़ाइलों को पढ़ने की कोशिश की है? क्या इस ज़िप फ़ाइल के साथ समस्या है? –

+0

क्या आप कोई अपवाद निगल रहे हैं? यदि नहीं, तो मिलता है नाम() zipfile का नाम वापस कर देता है? (सरल परीक्षण, लेकिन कुछ आश्चर्यजनक हो सकता है)। यदि आप OPEN_READ ध्वज के साथ या उसके बिना ज़िप खोलते हैं तो क्या आपको कोई अलग परिणाम मिलते हैं? –

+0

मुझे यकीन नहीं है, क्या आप 'जारफ़ाइल' के साथ प्रयास कर सकते हैं? ... –

उत्तर

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 में बहुत सारे बदलाव किए गए थे। इसलिए, यह संभव है कि आपका ऐप क्रैश हो रहा है क्योंकि आप महंगे डिस्क I/O ऑपरेशन को अलग Thread पर ऑफ़लोड नहीं कर रहे हैं।

2

यह एंड्रॉयड zipfile कार्यान्वयन के साथ एक ज्ञात समस्या है:

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

मूल रूप से ज़िप फ़ाइलें केवल 65k प्रविष्टियों तक का ही समर्थन। Zip64 नामक ज़िप फ़ाइल प्रारूप का एक विस्तारित संस्करण है, जो बड़ी संख्या में प्रविष्टियों का समर्थन करता है। दुर्भाग्य से एंड्रॉइड पर ज़िपफाइल Zip64 नहीं पढ़ सकता है। आपको शायद पता चलेगा कि C64Music.zip फ़ाइल Zip64 प्रारूप

मूल कार्यान्वयन के बजाय अपाचे कॉमन्स कंप्रेस लाइब्रेरी का उपयोग करने के लिए एक कार्य है। ZipFile का उनका संस्करण Zip64 का समर्थन करता है: http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipFile.html

संबंधित मुद्दे