2011-08-25 18 views
7

मैं DeflaterOutputStream के साथ एक बाइट सरणी में JSON स्ट्रिंग को राउंड-ट्रिप करने का प्रयास कर रहा हूं, लेकिन java.io.EOFException: Unexpected end of ZLIB input stream फेंकने वाला कोड नीचे दिया गया है।ZLIB इनपुट स्ट्रीम का अप्रत्याशित अंत

यह तब काम करता है जब आप "हैलो वर्ल्ड" के साथ स्ट्रिंग को प्रतिस्थापित करते हैं, या यदि आप नीचे स्ट्रिंग से कुछ वर्ण हटाते हैं।

कोई विचार?

public static void main(String[] args) throws IOException { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    DeflaterOutputStream deflate = new DeflaterOutputStream(bytes, new Deflater(Deflater.BEST_COMPRESSION, true)); 
    OutputStreamWriter writer = new OutputStreamWriter(deflate); 
    writer.write("[1,null,null,\"a\",null,null,null,null,[1,null,null,null,null,null,null,null,null,null,null,null,null,0.0,0.0,null,null]"); 
    writer.flush(); 
    writer.close(); 

    InflaterInputStream inflaterIn = new InflaterInputStream(new ByteArrayInputStream(bytes.toByteArray()), new Inflater(true)); 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inflaterIn)); 
    System.out.println(bufferedReader.readLine()); 
} 

जावा संस्करण (OSX):

java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode) 

उत्तर

8

मेरा मानना ​​है कि यह "नो-रैप" विकल्प है जो आप दोनों Deflater और Inflater में के लिए गुजर रहे हैं "सही" के साथ क्या करना है। इन दोनों को false पर सेट करने से समस्या ठीक हो जाती है - हालांकि मैं सिस्टम डिफ़ॉल्ट एन्कोडिंग का उपयोग करने के बजाय दोनों स्थानों में स्ट्रिंग एन्कोडिंग (उदा। यूटीएफ -8) को सेट करने की अनुशंसा करता हूं।

"nowrap" के लिये दस्तावेज काफी अस्पष्ट हैं, लेकिन वे राज्य:

नोट: 'nowrap' विकल्प का उपयोग करते समय यह भी इनपुट के रूप में एक अतिरिक्त "डमी" बाइट प्रदान करने के लिए आवश्यक है। कुछ अनुकूलन का समर्थन करने के लिए ZLIB मूल लाइब्रेरी द्वारा इसकी आवश्यकता होती है।

मुमकिन है इस डमी इनपुट बाइट, याद आ रही है, हालांकि यह स्पष्ट नहीं होता है, जहां यह जाना चाहिए ...

+0

यही है। निम्न को जोड़ना समस्या को हल करता है: \t \t bytes.write (0); – slipheed

+0

@ स्लीफेड: इसे सुनकर खुशी हुई :) –

12

मैं इस समस्या थी और यह था, क्योंकि मैं सही ढंग से मेरी आउटपुट स्ट्रीम को बंद नहीं किया गया।

+6

मुझे यह 'GZIPOutputStream' के साथ एक ही समस्या थी। Gzipped स्ट्रीम में लिखने के बाद मुझे 'फिनिश()' कॉल करने की आवश्यकता थी। – abellina

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