2013-05-17 10 views
8

हैलो साथी जावा डेवलपर्स को डिकंप्रेस करना। मैं नीचे के रूप में हेडर और शरीर के साथ एक प्रतिक्रिया प्राप्त करते हैं, लेकिन जब मैं नीचे दिए गए कोड का उपयोग कर इसे संपीड़न हटाने की कोशिश करते हैं, यह इस अपवाद के साथ विफल रहता है:एक gzipped http प्रतिक्रिया

 
java.io.IOException: Not in GZIP format 

प्रतिक्रिया:

 
HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Encoding: gzip 
Server: Jetty(6.1.x) 
▼  ═UMs¢0►=7┐ép?╙6-C╚$╢gΩ↓╟±╪₧∟zS╨╓╓♦$FÆ╒÷▀G┬╚╞8N≤╤Cf°►╦█╖╗o↨æJÄ+`:↓2 
♣»└√S▬L&?∙┬_)U╔|♣%ûíyk_à\,æ] hⁿ?▀xΓ∟o╜4♫ù\#MAHG?┤(Q¶╞⌡▌Ç?▼ô[7Fí¼↔φ☻I%╓╣Z♂?¿↨F;x|♦o/A╬♣╘≡∞─≤╝╘U∙♥0☺æ?|J%à{(éUmHµ %σl┴▼Ç9♣┌Ç?♫╡5╠yë~├╜♦íi♫╥╧ 
╬û?▓ε?╞┼→RtGqè₧ójWë♫╩∞j05├╞┘|>┘º∙↑j╪2┐|= ÷² 
eY\╛P?#5wÑqc╙τ♦▓½Θt£6q∩?┌4┼t♠↕=7æƒ╙?╟|♂;║)∩÷≈═^╛{v⌂┌∞◄>6ä╝| 

कोड:

byte[] b= IOUtils.toByteArray(sock.getInputStream()); 

ByteArrayInputStream bais = new ByteArrayInputStream(b); 
GZIPInputStream gzis = new GZIPInputStream(bais); 
InputStreamReader reader = new InputStreamReader(gzis); 
BufferedReader in = new BufferedReader(reader); 

String readed; 
while ((readed = in.readLine()) != null) { 
    System.out.println("read: "+readed); 
} 

कृपया सलाह दें।

धन्यवाद,

प्रदीप

+0

'सॉक' क्या है? यदि यह एक सॉकेट है, तो आपको पता होना चाहिए कि हेडर और कुछ अन्य सामान gzipped नहीं हैं। केवल प्रतिक्रिया शरीर है। –

उत्तर

2

माइम हैडर GZIP स्वरूप में नहीं है, यह सादे पाठ में है। स्ट्रीम को डिकंप्रेस करने से पहले आपको इसे पहले पढ़ना होगा।

इसके अलावा, क्यों सिर्फ इस का उपयोग नहीं:

InputStream in = sock.getInputStream(); 
readHeader(in); 
InputStream zin = new GZIPInputStream(in); 
+0

क्या आप मुझे बता सकते हैं कि हेडर पढ़ने से आपका क्या मतलब है कृपया पढ़ें हेडर (इन); ? – Bill

+1

मेरा मतलब है कि जब आपको फ़ाइल मिलती है तो आपको एक शीर्षलेख मिलेगा जो "सामग्री-प्रकार: टेक्स्ट/एचटीएमएल" जैसी चीजें कहता है जिसमें सादा पाठ में मेटाडेटा होता है। प्रत्येक मेटाडेटा तत्व को एक नई लाइन से अलग किया जाता है, और पूरा हेडर 2 न्यूलाइन के साथ समाप्त होता है, फिर डेटा शुरू होता है। http://en.wikipedia.org/wiki/MIME#MIME_headers –

1

इस सब के लिए पुस्तकालयों रहे हैं। उदाहरण के लिए, Apache HTTP Components का उपयोग कर सकते हैं, या आप यह देखने के लिए अपना ओपन सोर्स पढ़ सकते हैं कि यह क्या करता है। कम से कम, the relevant specification.

0

मैं दूसरा bmarguiles 'उत्तर पढ़ें।

केवल शरीर (आरएफसी में response-body) संकुचित है, तो आप केवल एक भाग \r\n\r\n के बाद यह है कि संपीड़न हटाने की जरूरत है।

आम तौर पर, आप उस डबल सीआरएलएफ द्वारा आधे में प्रतिक्रिया काट सकते हैं, और केवल दूसरे छमाही को डिकंप्रेस कर सकते हैं।

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