GZIPInputStream पठन लाइन द्वारा लाइन


85

मेरे पास .gz प्रारूप में एक फ़ाइल है। इस फ़ाइल को पढ़ने के लिए जावा वर्ग GZIPInputStream है। हालाँकि, यह वर्ग जावा के बफ़रड्रेडर श्रेणी का विस्तार नहीं करता है। नतीजतन, मैं फ़ाइल लाइन को लाइन से पढ़ने में सक्षम नहीं हूं। मुझे कुछ ऐसा ही चाहिए

reader  = new MyGZInputStream( some constructor of GZInputStream) 
reader.readLine()...

हालांकि मैंने अपनी कक्षा बनाने के लिए जो जावा के रीडर या बफ़ररेडर क्लास का विस्तार करता है और GZIPInputStream को इसके एक चर के रूप में उपयोग करता है।

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.util.zip.GZIPInputStream;

public class MyGZFilReader extends Reader {

    private GZIPInputStream gzipInputStream = null;
    char[] buf = new char[1024];

    @Override
    public void close() throws IOException {
        gzipInputStream.close();
    }

    public MyGZFilReader(String filename)
               throws FileNotFoundException, IOException {
        gzipInputStream = new GZIPInputStream(new FileInputStream(filename));
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        // TODO Auto-generated method stub
        return gzipInputStream.read((byte[])buf, off, len);
    }

}

लेकिन, जब मैं उपयोग करता हूं तो यह काम नहीं करता है

BufferedReader in = new BufferedReader(
    new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());

क्या कोई आगे बढ़ने की सलाह दे सकता है ।।


इस लिंक को देखने के stackoverflow.com/q/6717165/779408 । एक संपीड़ित और डीकंप्रेस विधि का प्रतिनिधित्व किया जाता है।
बोब्स

1
इस दुनिया में जो कुछ भी अच्छा और सही है उसके प्यार के लिए और किसी भी डेवलपर्स की पवित्रता के लिए, जो दूर से सार्थक कोड भी लिखते हैं ..... BE @ BEICK OF ENCODING AS @erickson POINTS OUT! वह एकमात्र ऐसा उत्तर है जो इस ओर इशारा करता है, जिससे मुझे रोना आता है।
जेम्स

जवाबों:


143

डेकोरेटर्स का मूल सेटअप इस प्रकार है:

InputStream fileStream = new FileInputStream(filename);
InputStream gzipStream = new GZIPInputStream(fileStream);
Reader decoder = new InputStreamReader(gzipStream, encoding);
BufferedReader buffered = new BufferedReader(decoder);

इस स्निपेट में मुख्य मुद्दा मूल्य है encoding। यह फ़ाइल में पाठ का वर्ण एन्कोडिंग है। क्या यह "US-ASCII", "UTF-8", "SHIFT-JIS", "ISO-8859-9", ... है? सैकड़ों संभावनाएं हैं, और सही विकल्प आमतौर पर फ़ाइल से ही निर्धारित नहीं किया जा सकता है। इसे कुछ आउट-ऑफ-बैंड चैनल के माध्यम से निर्दिष्ट किया जाना चाहिए।

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

अधिकांश नेटवर्क प्रोटोकॉल वर्ण एन्कोडिंग को स्पष्ट रूप से नोट करने के लिए हेडर या अन्य मेटाडेटा का उपयोग करते हैं।

इस स्थिति में, यह फ़ाइल एक्सटेंशन से प्रकट होता है कि सामग्री XML है। XML में इस उद्देश्य के लिए XML घोषणा में "एन्कोडिंग" विशेषता शामिल है। इसके अलावा, XML को वास्तव में XML पार्सर के साथ संसाधित किया जाना चाहिए, पाठ के रूप में नहीं। XML लाइन-बाय-लाइन पढ़ना एक नाजुक, विशेष मामले की तरह लगता है।

एन्कोडिंग को स्पष्ट रूप से निर्दिष्ट करने में असफल होना दूसरी आज्ञा के विरुद्ध है। अपने जोखिम पर डिफ़ॉल्ट एन्कोडिंग का उपयोग करें!


1
धन्यवाद यह काम किया ... हालांकि, पाठक कदम की कोई आवश्यकता नहीं है .. हम इसे GZIPInputStream gzip = new GZIPInputStream (new FileInputStream ("F: /gawiki-2009021414-stub-meta-history.xml.gz") के रूप में भी लिख सकते हैं )); बफ़रड्रेडर बीआर = नया बफ़रडेडर (नया इनपुटस्ट्रीमरेज़र (गज़िप));
कपिल डी।

12
@ कपिल्ड मुझे इस बात से दुखी करता है कि आप एन्कोडिंग के बारे में पूरी तरह से चूक गए ... जैसा कि आपकी टिप्पणी और उदाहरण द्वारा आपकी टिप्पणी में दिखाया गया है। एरिकसन का जवाब फिर से पढ़ें .... शायद 30 बार खत्म।
जेम्स

Gzip कमांड एन्कोडिंग को कैसे जानता है? मैं दुनिया भर से बहुत सारे लिनक्स / यूनिक्स सर्वर से बहुत सारी फाइलें पढ़ना चाहता हूं ... इसलिए मैं यह सुनिश्चित करना चाहता हूं कि मैं यह सही करूं ... पोस्ट में एन्कोडिंग का आमतौर पर फाइल द्वारा ही निर्धारण नहीं किया जा सकता है ... लेकिन gzip -d कमांड अलग इनपुट के बिना किसी भी फाइल पर काम करने लगता है ... (इसका अब मैं जो भी उपयोग करता हूं लेकिन इसे दरकिनार करना चाहता हूं), इसलिए मुझे लगता है कि अगर मैं सिर्फ यह समझ सकता हूं कि एन्कोडिंग को जानने के लिए gzip क्या करता है, तो मैं वही कर सकता है। कोई विचार / सुझाव क्या कोई मुझे सही दिशा में इंगित कर सकता है?
ग्लिफ़क्स

@glyphx आपका प्रश्न स्पष्ट नहीं है। क्या आपका मतलब है कि आप सामग्री प्रकार के बारे में कुछ बाहरी अभिकथन के अभाव में एक gzip फ़ाइल को कैसे पहचान सकते हैं? एक संकेत फ़ाइल एक्सटेंशन है, दूसरा फ़ाइल हेडर में जादू नंबर 0x1F8B की उपस्थिति है। हालाँकि, आप नहीं जान सकते कि कोई फ़ाइल एक मान्य gzip फ़ाइल है, जब तक आप वास्तव में पूरी चीज़ को संसाधित नहीं करते हैं।
इरिकसन

1
स्पष्ट होने के लिए मुझे पता है कि ये फाइलें gzip फाइलें हैं। और gzipped फ़ाइलें सभी पाठ आधारित फाइलें हैं, जैसे csv और पाइप डेलिम फाइलें। मैं बस इन फ़ाइलों को सीधे लाइन लाइन द्वारा जावा लाइन के साथ पढ़ने में सक्षम होना चाहता हूं। मैं उन्हें gzip -d कर सकता हूं और फिर उन्हें लाइन बाय लाइन नो प्रॉब्लम पढ़ सकता हूं। मैं एन्कोडिंग निर्दिष्ट करने के बारे में आपकी टिप्पणियों में बस उलझन में था ... मुझे लगता है कि अधिकांश फाइलें ASCII हैं ... लेकिन कुछ में एशियाई वर्ण हो सकते हैं इसलिए शायद यूटीएफ -8? मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि मैं इसे सही ढंग से करूं ... क्या यह कोई स्पष्ट है? धन्यवाद!
ग्लिफ़क्स

44
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"));
BufferedReader br = new BufferedReader(new InputStreamReader(gzip));
br.readLine();


आपका जवाब बहुत अच्छा है। लघु और संक्षिप्त .. हालाँकि, इरिकसन का उत्तर अधिक विस्तृत है।
कपिल डी


2

आप एक उपयोग वर्ग में निम्न विधि का उपयोग कर सकते हैं, और जब भी आवश्यक हो इसका उपयोग कर सकते हैं ...

public static List<String> readLinesFromGZ(String filePath) {
    List<String> lines = new ArrayList<>();
    File file = new File(filePath);

    try (GZIPInputStream gzip = new GZIPInputStream(new FileInputStream(file));
            BufferedReader br = new BufferedReader(new InputStreamReader(gzip));) {
        String line = null;
        while ((line = br.readLine()) != null) {
            lines.add(line);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace(System.err);
    } catch (IOException e) {
        e.printStackTrace(System.err);
    }
    return lines;
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.