2013-02-08 7 views
5

में निकाले बिना ज़िप्ड फ़ाइल की सामग्री को कैसे पढ़ा जाए मेरे पास ex.zip जैसे नाम हैं। इस उदाहरण में, ज़िप फ़ाइल में एक ही नाम वाली एक फ़ाइल होती है (यानी 'ex.txt'), जो काफी बड़ी है। मैं ज़िप फ़ाइल को हर बार निकालना नहीं चाहता हूं। मुझे ज़िप फ़ाइल निकालने के बिना फ़ाइल (ex.txt) की सामग्री को पढ़ने की आवश्यकता है। मैंने नीचे कुछ कोड की कोशिश की लेकिन मैं केवल चर के रूप में फ़ाइल का नाम पढ़ सकता हूं।जावा

मैं फ़ाइल की सामग्री को कैसे पढ़ूं और इसे चर में संग्रहीत कैसे करूं?

अग्रिम धन्यवाद

fis=new FileInputStream("C:/Documents and Settings/satheesh/Desktop/ex.zip"); 
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
ZipEntry entry; 

while((entry = zis.getNextEntry()) != null) { 
    i=i+1; 
    System.out.println(entry); 
    System.out.println(i); 
    //read from zis until available 
} 
+1

लिखा के रूप में: और यह बहुत ही सरल उपयोग करने के लिए है:

GZIPInputStream gis = new GZIPInputStream(new FileInputStream("file.txt.gz")); // and a BufferedReader on top to comfortably read the file BufferedReader in = new BufferedReader(new InputStreamReader(gis)); 

उन्हें उत्पादन उतना ही सरल है। क्या आप ज़िप से फाइल निकालना चाहते हैं या नहीं? क्या * विशिष्ट समस्या * आप हल करने की कोशिश कर रहे हैं? – parsifal

+0

इस तरह से अलविदा: नेविगेशन सिट्टम्स इसे वैसे ही करते हैं, वे अपने डिजिटल रोड मैप्स डेटा को मुख्य मेमोरी में संकुचित करते हैं, और मांग पर भागों को अनजिप करते हैं – AlexWien

उत्तर

5

आपका विचार के रूप में यह एक बाइट सरणी में है ज़िप फ़ाइल पढ़ सकते हैं और एक चर में संग्रहीत करना है। बाद में जब आप ज़िप जरूरत है आप मांग पर यह निकालने, बचत स्मृति:

पहले एक बाइट सरणी में ज़िप फ़ाइल की सामग्री पढ़ने zipFileBytes

आप जावा 1.7 हों:

Path path = Paths.get("path/to/file"); 
byte[] zipFileBytes= Files.readAllBytes(path); 

अन्यथा lib

byte[] zipFileBytes; 
zipFileBytes = IOUtils.toByteArray(InputStream input); 

अब आप अपने पिन Appache.commons का उपयोग फ़ाइल एक परिवर्तनीय ज़िपिपाइलबाइट्स में संग्रहीत है, अभी भी संपीड़ित रूप में।

तब जब आप कुछ उपयोग

ByteArrayInputStream bis = new ByteArrayInputStream(zipFileBytes)); 
ZipInputStream zis = new ZipInputStream(bis); 
4

निकालने के लिए की जरूरत है इस प्रयास करें:

 ZipFile fis = new ZipFile("ex.zip"); 

     int i = 0; 
     for (Enumeration e = zip.entries(); e.hasMoreElements();) { 
      ZipEntry entry = (ZipEntry) e.nextElement(); 
      System.out.println(entry); 
      System.out.println(i); 

      InputStream in = fis.getInputStream(entry); 

     } 

उदाहरण के लिए, यदि फ़ाइल पाठ होता है, और आप एक स्ट्रिंग के रूप में यह प्रिंट करना चाहते हैं, आप कर सकते हैं इस तरह इनपुटस्ट्रीम पढ़ें: Read/convert an InputStream to a String

2

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

GZIPOutputStream gos = new GZIPOutputStream(new FileOutputStream("file.txt.gz")); 
+0

उत्तर नहीं देता है, वह एक चर में संपीड़ित रूप में ज़िप चाहता है। उद्धरण: मैं हर बार ज़िप फ़ाइल को डिस्क पर निकालना नहीं चाहता हूं और उसके बाद अपना डेटा – AlexWien

+0

@AlexWien पढ़ता हूं, यह सिर्फ सामग्री को पढ़ने की अनुमति नहीं देता है (बाइट द्वारा बाइट या लाइन द्वारा दिखाए गए लाइन के रूप में) ** बिना ** पूरी फाइल को एक बार में विस्तारित करना, और यह मेरी समझ थी कि ओपी के बाद यही है। मैं केवल उन फ़ाइलों को ज़िपित करने का विकल्प इंगित करना चाहता था जो एक ज़िप फ़ाइल के साथ काम करना आसान है। एक चर फ़ाइल के रूप में एक ज़िप फ़ाइल भंडारण कोई व्यावहारिक अनुप्रयोग नहीं है। – fvu

+0

इसका अस्पष्ट, वह क्या चाहता था, शायद वह चाहता था कि आपका समाधान क्या है, डिस्क पर एक नई फाइल बनाने के लिए श्वेतआउट को अनजिप करें। एक ज़िप फ़ाइल को एक अटारी में रखने के लिए हमेशा मूर्ख नहीं होता है: फ़ाइल से पढ़ने की तुलना में बाइट सरणी से अनजिप करने के तरीके इसके बारे में सोचते हैं: कल्पना कीजिए कि आपको दूसरी बार 100 गुना अनजिप करना होगा, आप डिस्क एसेस के साथ ऐसा नहीं कर सकते हैं, एक एम्बेडेड डिवाइस पर कम कैश कई आवेदन हैं: उदाहरण के लिए नक्शा मिलान प्रणाली, जो ट्रैक को गणना करता है कि एक वाहन दो बड़े देशों में गाड़ी चला रहा था: डिस्क से पढ़ना धीमा होगा – AlexWien