Java数据流解压缩

时间:2012-05-24 00:30:08

标签: java stream bufferedreader compression

从套接字(缓冲区)获取数据

BufferedReader is = new BufferedReader(new InputStreamReader(download.getInputStream()));

数据解压缩

Inflater decompresser = new Inflater();
decompresser.setInput(buffer.toString().getBytes());
byte[] dataBytes = new byte[8388608];
int resultLength = decompresser.inflate(dataBytes);
decompresser.end();
System.out.println("decompressed" + new String(dataBytes, 0, resultLength)+ " RESULTLENGHT " +resultLength);

发送1000个字节,压缩ZLIB并转(800-900字节) 但我不知道发送的大小究竟是什么。我需要一次从套接字1字节读取并立即解压缩,直到解压缩数据的总大小等于1000字节。

要一次读取一个字节,我会这样做:

StringBuilder buffer = new StringBuilder();
StringBuilder unpackbuffer = new StringBuilder();
do buffer.append((char)is.read());
while(buffer.charAt(buffer.length()-1) != '|' && (byte)buffer.charAt(buffer.length()-1) != -1);

如何填写此循环unpackbuffer?并检查它的大小? 对不起,我希望我的问题很清楚。

1 个答案:

答案 0 :(得分:1)

好的,如果您不能将长度预先设置为您要发送的数据,然后在另一端读入(如果您能够设计协议以允许此操作,这显然是最简单的理想解决方案),然后你可以“逐字节”压缩流。诀窍是创建一个1字节的缓冲区作为输入缓冲区。然后代码如下所示:

    Inflater infl = new Inflater();
    byte[] buf = new byte[1];
    byte[] outputBuf = new byte[512];
    while (!infl.finished()) {
        while (infl.needsInput()) {
            buf[0] = ...next byte from stream...
            infl.setInput(buf);
        }
        int noUnc = infl.inflate(outputBuf);
       // the first "noUnc" bytes of outputBuf contain the next bit of data
    }
相关问题