2009-11-16 18 views
5

मैं एक सेवा कहता हूं जो एक gzipped फ़ाइल देता है। मेरे पास प्रतिक्रिया से इनपुट इनपुट (javax.activation.DataHandler.getInputStream(); की सौजन्य) के रूप में डेटा है।मैं GZIPed डेटा के इनपुटस्ट्रीम से डिकंप्रेस्ड डेटा का इनपुटस्ट्रीम कैसे प्राप्त करूं?

मैं डिस्क पर कुछ भी लिखने के बिना क्या करना चाहता हूं, संग्रह में मौजूद फ़ाइल में डिकंप्रेस्ड डेटा का इनपुटस्ट्रीम प्राप्त करें। इस मामले में संपीड़ित फ़ाइल एक एक्सएमएल दस्तावेज़ है जिसे मैं javax.xml.bind.Unmarshaller का उपयोग करके अनारशल करने की कोशिश कर रहा हूं जो इनपुटस्ट्रीम लेता है।

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

मैं डिस्क में प्रारंभिक इनपुटस्ट्रीम लिख सकता हूं और एक gz फ़ाइल प्राप्त कर सकता हूं, और तब उस फ़ाइल को पढ़ सकता हूं, संपीड़ित फ़ाइल को इससे बाहर निकाल सकता हूं और वहां से जा सकता हूं लेकिन मैं इसे स्मृति में सभी को रखना चाहता हूं।

अद्यतन 1: यहाँ मेरे वर्तमान है (काम नहीं कर रहा है - एक "न GZIP प्रारूप में" अपवाद मिलता है):

ByteArrayInputStream xmlInput = null; 
    try { 
     InputStream in = dh.getInputStream(); //dh is a javax.activation.DataHandler 
     BufferedInputStream bis = new BufferedInputStream(in); 
     ByteArrayOutputStream bo = new ByteArrayOutputStream(); 
     int bytes_read = 0; 
     byte[] dataBuf = new byte[4096]; 
     while ((bytes_read = bis.read(dataBuf)) != -1) { 
      bo.write(dataBuf, 0, bytes_read); 
     } 
     ByteArrayInputStream bin = new ByteArrayInputStream(bo.toByteArray()); 
     GZIPInputStream gzipInput = new GZIPInputStream(bin); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     dataBuf = new byte[4096];; 
     bytes_read = 0; 
     while ((bytes_read = gzipInput.read(dataBuf)) > 0) { 
      out.write(dataBuf, 0, bytes_read); 
     } 
     xmlInput = new ByteArrayInputStream(out.toByteArray()); 

अगर मैं एक FileOutputStream को पहली बार लिखने के बजाय एक ByteArrayOutputStream के लिए लिख के मैं एक संपीड़ित फ़ाइल प्राप्त करें (जिसे मैं xml फ़ाइल को मैन्युअल रूप से प्राप्त करने के लिए मैन्युअल रूप से खोल सकता हूं) और सेवा (ईबे) कहती है कि यह एक gzip फ़ाइल होना चाहिए, इसलिए मुझे यकीन नहीं है कि मुझे "GZIP प्रारूप में नहीं" त्रुटि क्यों मिलती है।

अपडेट 2: मैंने कुछ अलग करने की कोशिश की - एक ही त्रुटि ("जीजेआईपी प्रारूप में नहीं")। वाह, मैंने अभी अर्ध-कॉलन के साथ उस कोष्ठक को समाप्त करने की कोशिश की। वैसे भी, मेरा दूसरा प्रयास है, जो अभी भी काम नहीं करता है:

ByteArrayInputStream xmlInput = null; 
    try { 
     GZIPInputStream gzipInput = new GZIPInputStream(dh.getInputStream()); 
     ByteArrayOutputStream bo = new ByteArrayOutputStream(); 
     int bytes_read = 0; 
     byte[] dataBuf = new byte[4096]; 
     while ((bytes_read = gzipInput.read(dataBuf)) != -1) { 
      bo.write(dataBuf, 0, bytes_read); 
     } 
     xmlInput = new ByteArrayInputStream(bo.toByteArray()); 
+0

ऐसा लगता है कि एक बड़ी समस्या यह थी कि eBay ने कहा कि वे मुझे एक gzip दे रहे थे लेकिन यह वास्तव में एक ज़िप था। –

उत्तर

2

निम्नलिखित कोड काम करना चाहिए। ध्यान रखें कि आपको अपवादों को सही तरीके से संभालना होगा।

OutputStream out = null; 
InputStream in = null; 
try { 
    out = /* some output stream */; 
    in = new java.util.GZIPInputStream(/*some stream*/); 
    byte[] buffer = new byte[4096]; 
    int c = 0; 
    while ((c = in.read(buffer, 0, 4096)) > 0) { 
     out.write(buffer, 0, c); 
    } 
} finally { 
    if (in != null) { 
     in.close(); 
    } 
    if (out != null) { 
     out.close(); 
    } 
} 
0

GZIPInputStream पर एक नज़र डालें। ; कक्षा इसे बहुत पारदर्शी रूप से संभालती है, इसका उपयोग करने के लिए लगभग कोई काम नहीं है।

+1

बस जिज्ञासा: क्यों 1.4.2 की व्याख्या? यहां उपलब्ध नवीनतम क्यों नहीं? http://java.sun.com/javase/6/docs/api/java/util/zip/GZIPInputStream.html – BalusC

+0

क्षमा करें, मुझे "मुझे लगता है कि पहले 1.4.2 में उपलब्ध है" के साथ जाना चाहिए था। मुझे इसे संपादित करने दें। :-) –

+0

मैं वर्तमान में काम कर रहा हूं जिसमें GZIPInputStream देख रहा हूं हालांकि मुझे "GZIP प्रारूप में नहीं" अपवाद मिलता है। मुझे यह समझ में नहीं आता क्योंकि मैं डिस्क पर फ़ाइल लिख सकता हूं और यह एक संपीड़ित फ़ाइल है (दस्तावेज़ीकरण के अनुसार gzip)। मैं जो जोड़ूं (वर्तमान में काम नहीं कर रहा हूं) जोड़ दूंगा। –

3

GZIPInputStream के साथ इनपुट स्ट्रीम को सजाने के लिए।

InputStream decompressed = new GZIPInputStream(compressed); 
संबंधित मुद्दे