使用inflater和InflaterInputStream从流中读取缩小的数据

时间:2015-06-15 10:01:26

标签: java android

我正在尝试通过http发送一个缩小的字符串,当我在服务器端使用压缩和解压缩而不使用流时,它可以,但是当我将其写入流时,如下所示:

          byte[] deflatedData = mtext.getByte();
          try {
                t.sendResponseHeaders(200,deflatedData.length);
            } catch (IOException e1) {
                display(e1);
                e1.printStackTrace();
                if(closeafter){
                    t.close();
                }
                return;
            }
                DeflaterOutputStream os = new DeflaterOutputStream(t.getResponseBody());
          try {
            os.write(deflatedData ,0,deflatedData .length);
        } catch (IOException e1) {
            mByte = null;
            display(e1);
            if(closeafter){
                t.close();
            }
            return;
        }

            os.flush();
            os.close();

并从客户端读取如下:

 InflaterInputStream ini = new     
 InflaterInputStream(response.body().byteStream());
        ByteArrayOutputStream bout =new ByteArrayOutputStream(512);
        int b;
        while ((b = ini.read()) != -1) {
              bout.write(b);
        }
        ini.close();
        bout.close();

        String s=new String(bout.toByteArray());

android解压缩如下:

 public static byte[] decompress(byte[] data) throws IOException, DataFormatException{  
       Inflater inflater = new Inflater();   
       inflater.setInput(data);  

       ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);  
       byte[] buffer = new byte[1024];  
       while (!inflater.finished()) {  
        int count = inflater.inflate(buffer);  
        outputStream.write(buffer, 0, count);  
       }  

       byte[] output = outputStream.toByteArray();  
       outputStream.close();  
       inflater.end();

       return output;  
      }  

所以我得到以下异常:

  java.util.zip.DataFormatException: data error

我哪里错了?

1 个答案:

答案 0 :(得分:0)

发送部分完全没问题,答案是直接从输入流使用InflaterInputStream,如下所示:

 public static String ReadDeflatedData(InputStream input){

    InflaterInputStream in = new InflaterInputStream(input, new Inflater());

    int bytesRead=0;
    StringBuilder sb = new StringBuilder();

    byte[] contents = null;
    try {
        contents = new byte[in.available()];
    } catch (IOException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }


    try {
        while( (bytesRead = in.read(contents)) != -1){

              sb.append(new String(contents, 0, bytesRead));
        }
    } catch (IOException e) {
        System.out.println(e.toString());
        e.printStackTrace();
    }

    try {
        return new String(sb.toString().getBytes(),"UTF-8");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return null;

}