2011-01-13 16 views
11

मैं थोड़ा उलझन में हूं। मुझे पता है कि एक खाली ज़िप कानूनी नहीं है। लेकिन क्या इस नमूने स्निपेट के बारे में:समापन ZipOutputStream

ZipOutputStream zos = null; 
try 
{ 
    zos = new ZipOutputStream(new FileOutputStream("...")); 
    // 
    //.. 
    // 
} 
finally 
{ 
    zos.close(); 
} 

कोई जिप प्रविष्टियों किसी कारण (संभवतः असाधारण स्थिति है) तो निम्न अपवादों के पास प्रयास पर डाल दिया जाएगा के लिए जोड़ा गया था, तो:

Exception in thread "main" java.util.zip.ZipException: ZIP file must have at least one entry 
    at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:304) 
    at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:146) 
    at java.util.zip.ZipOutputStream.close(ZipOutputStream.java:321) 

इस स्थिति में धारा को बंद करने का सबसे साफ तरीका क्या होगा?

धन्यवाद ...

उत्तर

7

आपको FileOutputStream को बंद करना चाहिए, ZipOutputStream नहीं, क्योंकि पूर्व वास्तव में सिस्टम संसाधनों का उपभोग करता है।

IOUtils वर्ग Jakarta Commons IO में पाया जाता है। इसका उपयोग करने का अर्थ है कि आपको संभावित-लेकिन-शायद-उपयोगी-उपयोगी IOException से निपटने की आवश्यकता नहीं है जिसे close() द्वारा फेंक दिया जा सकता है।

+0

आपकी मदद के लिए धन्यवाद, यह सच होना चाहिए :-) –

+0

@ लूचो - इसे और अधिक मजबूत बनाने के लिए उदाहरण को संपादित किया। – Anon

+6

यह समाधान ठीक है, लेकिन तर्क गलत है: आप या तो स्ट्रीम बंद कर सकते हैं। ZipOutputStream जैसे रैपर स्ट्रीम को बंद करने से निम्न-स्तर फ़ाइलऑटपुटस्ट्रीम भी बंद हो जाएगा। –

3

यदि आप ज़िप धारा सामान जोड़ा आप पर नज़र रखने और केवल इसे बंद जब चीजें जोड़ा गया था चाहिए:

ZipOutputStream zos = null; 
OutputStream file = new FileOutputStream("...") 
int itemsAdded=0; 
try 
{ 
    zos = new ZipOutputStream(file); 
    // 
    //.. 
    // itemsAdded++; 
} 
finally 
{ 
    if (itemsAdded > 0) { 
     zos.close(); 
    } else { 
     file.close(); 
    } 
} 
अगर आप गिनती की जरूरत नहीं है की

सिर्फ एक का उपयोग boolean ध्वज।

+0

ज़िप फ़ाइल खुला रहता है और इस तरह से बंद कर दिया ... यह कैसे बंद करने के लिए? –

+0

@ लूचो ने ज़िप कोड खाली होने पर फ़ाइल को बंद करने के लिए कुछ कोड जोड़ा। जरा देखो तो। –

3

केवल चीजों को जोड़ने के बाद स्ट्रीम को बंद करने के बजाय, मैंने जो किया वह यह देखने के लिए है कि पिन कोड चलाने से पहले ज़िप करने के लिए कुछ भी था या नहीं। इससे मुझे प्रक्रिया को सरल बनाने में मदद मिली और मुझे लगता है कि "ज़िप फ़ाइल में कम से कम एक प्रविष्टि" समस्या को संभालने के लिए सामान्य रूप से उपयोग किया जा सकता है। यह सच है कि zos बंद करने से अन्य अपवाद फेंक सकते हैं, लेकिन यह दुर्लभ है।

मुझे लगता है कि यह जावा के साथ समस्या है, जो ज़िप करने के लिए कोई फ़ाइल नहीं होने पर मामले को संभाल नहीं करता है।

यानी:

int itemsToAdd=0; 
//.... 

if (itemsToAdd > 0) { 

    ZipOutputStream zos = new ZipOutputStream(file); 
    try { 
     //add files to zip 
    } 
    finally { 
     zos.close(); 
    } 
} 
संबंधित मुद्दे