मैं एक सेवा कहता हूं जो एक 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());
ऐसा लगता है कि एक बड़ी समस्या यह थी कि eBay ने कहा कि वे मुझे एक gzip दे रहे थे लेकिन यह वास्तव में एक ज़िप था। –