2012-08-02 30 views
11

कहो हम कोड की तरह:ZipInputStream.getNextEntry() कैसे काम करता है?

File file = new File("zip1.zip"); 
ZipInputStream zis = new ZipInputStream(new FileInputStream(file)); 

चलो मान लें कि आपके है जिसमें निम्न शामिल एक .zip फ़ाइल है:

  • zip1.zip
    • hello.c
    • world.java
    • फ़ोल्डर 1
      • foo.c
      • bar.java
    • foobar.c

कैसे zis.getNextEntry() के माध्यम से पुनरावृति हैं?

क्या यह hello.c, world.java, folder1, foobar.c वापस करेगा और फ़ोल्डर 1 में फ़ाइलों को पूरी तरह से अनदेखा करेगा?

या यह hello.c, world.java, folder1, foo.c, bar.java, और फिर foobar.c वापस करेगा?

क्या यह फ़ोल्डर 1 भी वापस करेगा क्योंकि यह तकनीकी रूप से एक फ़ोल्डर है, न कि फ़ाइल?

धन्यवाद!

+0

ज़िपेंन्ट्री भी एक निर्देशिका का प्रतिनिधित्व कर सकते हैं। [IsDirectory()] (http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipEntry.html#isDirectory()) विधि देखें। – Bobulous

उत्तर

8

हां। यह फ़ोल्डर नाम भी प्रिंट करेगा, क्योंकि यह ज़िप के भीतर भी एक प्रविष्टि है। यह उसी क्रम में भी प्रिंट करेगा जैसा कि यह ज़िप के अंदर प्रदर्शित होता है। आप अपने आउटपुट को सत्यापित करने के लिए नीचे परीक्षण का उपयोग कर सकते हैं।

public class TestZipOrder { 
    @Test 
    public void testZipOrder() throws Exception { 
     File file = new File("/Project/test.zip"); 
     ZipInputStream zis = new ZipInputStream(new FileInputStream(file)); 
     ZipEntry entry = null; 
     while ((entry = zis.getNextEntry()) != null) { 
     System.out.println(entry.getName()); 
     } 
    } 
} 
1

यहां से उद्धरण: https://blogs.oracle.com/CoreJavaTechTips/entry/creating_zip_and_jar_files

java.util.zip पुस्तकालयों ZipOutputStream का जोड़ा प्रविष्टियों के लिए नियंत्रण के कुछ स्तर प्रदान करते हैं।

पहला, जिस क्रम में आप ZipOutputStream में प्रविष्टियां जोड़ते हैं वह वह क्रम है जो वे भौतिक रूप से .zip फ़ाइल में स्थित हैं।

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

तो मुझे विश्वास होगा कि आपको प्रविष्टियों() विधि का उपयोग उस क्रम को देखने के लिए करना होगा जिसमें इसे पुनरावृत्त किया जाएगा।

ZipFile zf = new ZipFile("your file path with file name"); 
    for (Enumeration<? extends ZipEntry> e = zf.entries(); 
    e.hasMoreElements();) { 
     System.out.println(e.nextElement().getName()); 
    } 
20

अच्छी तरह से ...देख सकते हैं:

 ZipInputStream zis = new ZipInputStream(new FileInputStream("C:\\New Folder.zip")); 
     try 
     { 
      ZipEntry temp = null; 
      while ((temp = zis.getNextEntry()) != null) 
      { 
      System.out.println(temp.getName()); 
      } 
     } 

आउटपुट:

नया फ़ोल्डर/

नया फ़ोल्डर/फ़ोल्डर 1/

नया फ़ोल्डर/फ़ोल्डर 1/bar.java

नया फ़ोल्डर/फ़ोल्डर 1 /foo.c

नया फ़ोल्डर/foo bar.c

नया फ़ोल्डर/hello.c

नया फ़ोल्डर/world.java

+0

धन्यवाद, अगर मेरे पास 15 प्रतिष्ठा थी, तो मैं इसे ऊपर उठाऊंगा! – joshualan

+0

@joshualan - या आप बस कोड का एक टुकड़ा लिखने और इसे स्वयं परीक्षण करने की कोशिश कर सकते थे :) – Sujay

+0

मैंने कोशिश की और मुझे नहीं पता था कि आपको मेरी निर्देशिका तक पहुंचने के लिए सी: \\ करना था। न्यूबी गलती: एस – joshualan

1

ज़िप फ़ाइल आंतरिक निर्देशिका सभी फ़ाइलों और ज़िप में निर्देशिका की एक "फ्लैट" सूची है। getNextEntry सूची के माध्यम से फिर से शुरू होगा और अनुक्रमिक रूप से ज़िप फ़ाइल में प्रत्येक फ़ाइल और निर्देशिका की पहचान करेगा।

ज़िप फ़ाइल प्रारूप का एक संस्करण है जिसमें कोई केंद्रीय निर्देशिका नहीं है, जिस स्थिति में (यदि यह बिल्कुल संभाला जाता है) मुझे संदेह है कि आप ज़िप में सभी वास्तविक फ़ाइलों के माध्यम से पुनरावृत्त करेंगे, निर्देशिका छोड़ने (लेकिन फ़ाइलों को छोड़ना नहीं) निर्देशिका में)।

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