2014-06-17 14 views
5

मेरे पास वर्तमान में मेरी लाइब्रेरी में एक व्यावहारिक संसाधन रिसाव है क्योंकि इस तथ्य के कारण कि मैं एक ज़िपफाइल खोलता हूं ताकि एक निश्चित ज़िपेंट्री के लिए लौटाई गई इनपुटस्ट्रीम बंद न हो। हालांकि, लौटाए गए इनपुटस्ट्रीम को बंद करने से बाकी ज़िपफाइल बंद नहीं होता है, इसलिए मैं इसके साथ फंस गया हूं। क्या ZipFile को सुरक्षित रूप से बंद करने और वापस आने के लिए इनपुटस्ट्रीम रखने का कोई तरीका है?क्या ज़िपफ़ाइल बंद होने के बाद ज़िपइन्ट्री जारी रहता है?

/* 
* Inner class implementing the input stream used to read a 
* (possibly compressed) zip file entry. 
*/ 
private class ZipFileInputStream extends InputStream { 

    ... 

    public int read(byte b[], int off, int len) throws IOException { 
     if (rem == 0) { 
      return -1; 
     } 
     if (len <= 0) { 
      return 0; 
     } 
     if (len > rem) { 
      len = (int) rem; 
     } 
     synchronized (ZipFile.this) { 
      ensureOpenOrZipException(); 

सूचना #ensureOpenOrZipException करने के लिए कॉल:

उत्तर

4

यहाँ InputStream from ZipFile के कार्यान्वयन है।

तो दुर्भाग्य से आपके प्रश्न का उत्तर दुर्भाग्य से नहीं है, स्ट्रीम को खोलने का कोई तरीका नहीं है।

आप के बजाय कर लपेट और InputStream पर # बंद करें हुक है अपने ज़िप फ़ाइल बंद करने के लिए कर सकता है क्या:

InputStream zipInputStream = ... 
return new InputStream() { 
    @Override 
    public int read() throws IOException { 
     return zipInputStream.read(); 
    } 
    @Override 
    public void close() throws IOException { 
     zipInputStream.close(); 
     zipFile.close(); 
    } 
} 

एक और दृष्टिकोण यह बफ़र होना होगा:

InputStream myZipInputStream = ... 
//Read the zip input stream fully into memory 
byte[] buffer = ByteStreams.toByteArray(zipInputStream); 
zipFile.close(); 
return new ByteArrayInputStream(buffer); 

जाहिर है इस है अब सब मेमोरी में चले गए, इसलिए आपके डेटा को उचित आकार की आवश्यकता होगी।

+0

यह एक हैक का थोड़ा सा है, लेकिन यह काम करता है! –

+0

यह एक हैक क्यों है? यह ज़िप # क्लोज़ का एक सरल encapsulation है। मैंने एक और दृष्टिकोण जोड़ा जो मेरा पहला विचार था, लेकिन यह एक मेमोरी बफर का उपयोग करता है, जो आपके लिए काम नहीं कर सकता है। – Kong

+0

असल में कोड को देखते हुए, मुझे एहसास हुआ कि 'getInputStream' केवल एक इनपुटस्ट्रीम देता है, मैंने सोचा कि यह अधिक विशिष्ट था। यह तब एक हैक नहीं है! –

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