2011-08-25 40 views
7

Tôi đang cố gắng đi vòng một chuỗi JSON thành một mảng byte với DeflaterOutputStream, nhưng mã bên dưới ném java.io.EOFException: Unexpected end of ZLIB input stream.Kết thúc không mong đợi của luồng đầu vào ZLIB

Tính năng này hoạt động khi bạn thay thế chuỗi bằng "Hello world" hoặc nếu bạn xóa một vài ký tự khỏi chuỗi bên dưới.

Bất kỳ ý tưởng nào?

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()); 
} 

phiên bản Java (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) 

Trả lời

8

Tôi tin rằng đó là để làm với các tùy chọn "no-wrap" mà bạn đang đi qua "true" cho trong cả DeflaterInflater. Đặt cả hai vấn đề này thành false sẽ khắc phục sự cố - mặc dù tôi khuyên bạn nên đặt mã hóa chuỗi ở cả hai vị trí thành (ví dụ: UTF-8) thay vì sử dụng mã hóa mặc định của hệ thống.

Các tài liệu cho "nowrap" là khá mơ hồ, nhưng họ nêu:

Lưu ý: Khi sử dụng tùy chọn 'nowrap' nó cũng là cần thiết để cung cấp thêm một "dummy" byte như là đầu vào. Điều này là bắt buộc bởi thư viện gốc ZLIB để hỗ trợ tối ưu hóa nhất định.

lẽ byte đầu vào hình nộm này là mất tích, mặc dù nó không giải thích nơi cần đi ...

+0

Vậy đó. Thêm các bản sửa lỗi sau đây: \t \t bytes.write (0); – slipheed

+0

@slipheed: Rất vui khi biết điều đó :) –

12

Tôi có vấn đề này và đó là bởi vì tôi đã không đóng cửa một cách chính xác dòng đầu ra của tôi.

+6

Tôi gặp vấn đề tương tự với 'GZIPOutputStream'. Tôi cần gọi 'finish()' sau khi tôi viết xong luồng gzipped. – abellina

Các vấn đề liên quan