2009-11-12 4 views
26

से एक इनपुट स्ट्रीम कैसे बना सकता हूं मेरे पास एक कक्षा है जो ज़िप्पेन्ट्री को लपेटती है, लेकिन मैं यह देखने के लिए संघर्ष कर रहा हूं कि मैं फिर एक विधि लिख सकता हूं जो किसी भी एक ज़िप से इनपुट स्ट्रीम लौटाता है। मैंने कुछ ऐसा लिखने में कामयाब रहा जो ज़िपफाइल के लिए इनपुट स्ट्रीम की एक सरणी लौटा सकता है, लेकिन मुझे केवल एक ज़िपेंट्री से इनपुट स्ट्रीम प्राप्त करने का एक तरीका चाहिए।मैं ZipEntry

+3

देखो: http://stackoverflow.com/questions/3233555/is-it-possible-to-get-a-zipentrys-inputstream-from-a-zipinputstream – diyism

उत्तर

20

क्या आपके पास ज़िपफ़ाइल उदाहरण नहीं है जिससे ज़िपेंट्री को सोर्स किया गया था? यदि आप करते हैं तो आप ZipFile.getInputStream (ZipEntry) का उपयोग कर सकते हैं।

https://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipFile.html

पी एस। बस कोड पर एक त्वरित नज़र डाली थी और ज़िप फ़ाइल में अंतर्निहित डेटा के लिए ज़िपेंट्री एक रैपर नहीं है। जहां तक ​​मैं देख सकता हूं, प्रवेश के लिए यह सिर्फ "प्लेस धारक" है (यानी ज़िप फ़ाइल विशेषता डेटा नहीं है)। असली स्ट्रीम ZipIile क्लास में जेएनआई कॉल के माध्यम से बनाई गई है। मतलब यह है कि मुझे विश्वास नहीं है कि आप जो भी कर रहे हैं वह व्यावहारिक तरीके से कर सकते हैं।

+0

मैल्कम, मदद के लिए धन्यवाद, मुझे बस उस विधि को मिला। मेरी समस्या अब यह है कि कोड जो मूल रूप से ज़िप फ़ाइल खोलता है (जब आप ज़िपफाइल ज़िप = नया ज़िपफाइल ("पथ") करते हैं;), फिर उसे बंद कर देता है। अगर मैं चाहता हूं तो मैं इसे बंद कर सकता हूं, लेकिन मैं सोच रहा था - ज़िप/जार बंद करने के नतीजे क्या हैं? जाहिर है अगर मैं करीबी() कमांड को हटा देता हूं तो मैं एक विधि छोड़ दूंगा ताकि उपयोगकर्ता इसे बाद में बंद कर सके, लेकिन मैं सोच रहा था कि क्या होगा यदि उपयोगकर्ता भूल गया - बस स्मृति पर लालची? मुझे पता है कि यह डेटा के लिए एक रैपर नहीं है - जो मैं लिख रहा हूं वह ज़िप/जार फ़ाइलों से निपटने के लिए एक रैपर है। – Stephen

+1

इसे खोलने से मुझे अच्छा विचार नहीं लगता है। समान रूप से आपके समाधान के उपयोगकर्ता को बंद करने की ज़िम्मेदारी को खारिज करने के लिए। एक विकल्प (संभवतः - मैं जिस समस्या को हल कर रहा हूं उस पर अनुमान लगा रहा हूं) ZipEntry को लपेटना और रैपिंग क्लास में ज़िपफाइल के लिए एक हैंडल शामिल करना है। यह थोड़ा भारी लगता है लेकिन इसका मतलब यह है कि जब भी आपको आवश्यकता हो तो आप लिपटे ज़िप प्रविष्टि में एक स्ट्रीम को बंद कर सकते हैं। कोड स्निपेट के लिए –

27

इस बारे में कैसे?

ZipFile zipFile = new ZipFile("file.zip"); 
ZipEntry zipEntry = zipFile.getEntry("fileName.txt");  
InputStream inputStream = zipFile.getInputStream(zipEntry); 
+0

+1। –

+1

दुर्भाग्यवश 1.4.2_12 में ज़िपफाइल लीक फ़ाइल हैंडल का एक नया उदाहरण बनाना –

4
static void printInputStream(File zip) throws IOException 
    { 
     ZipInputStream zin = new ZipInputStream(new FileInputStream(zip)); 
     for (ZipEntry zipEntry;(zipEntry = zin.getNextEntry()) != null;) 
     { 
      System.out.println("reading zipEntry " + zipEntry.getName()); 
      Scanner sc = new Scanner(zin); 
      while (sc.hasNextLine()) 
      { 
       System.out.println(sc.nextLine()); 
      } 
      System.out.println("reading " + zipEntry.getName() + " completed"); 
     } 
     zin.close(); 
    } 

यह यहाँ पाया गया था: क्या इनपुट धारा है कि ज़िप फ़ाइल से खोला जाता है में
getInputStream for a ZipEntry from ZipInputStream (without using the ZipFile class)

गलतफहमी। समाधान: ज़िप फ़ाइल ज़िप इनपुटपुट zipInputStream = ZipInputStream(new FileInputStream(zipfile), रन चक्र zipInputStream.getNextEntry() से खुली इनपुट स्ट्रीम। प्रत्येक दौर के लिए आपके पास वर्तमान प्रविष्टि के लिए इनपुटस्ट्रीम है (पहले ज़िप फ़ाइल के लिए खोला गया है); .. पर

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