【问题标题】:Java Data stream decompressionJava数据流解压
【发布时间】:2012-05-24 00:30:07
【问题描述】:

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

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

如何填写这个循环解包缓冲区?并检查它的大小? 抱歉,我希望我的问题很清楚。

【问题讨论】:

    标签: java stream bufferedreader compression


    【解决方案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
        }
    

    【讨论】:

    • 很遗憾没有提供协议
    • 我不明白——你不是同时写打包字节的代码和解包它们的代码吗?你不能只附加你想要的任何字节吗?
    • 不,我正在为NMDC协议编写客户端,无法控制整个系统。有没有办法为 java 解压流媒体?
    • 好的,抱歉。是的,如果迫在眉睫,你可以做到,虽然它有点难看 - 已通过答案修改。
    • 尼尔科菲,谢谢你的好主意。我被提议替换 BufferedReader -> InflaterInputStream,但不知道哪种解决方案更好。似乎使用带有 UTP-8 字符的 InflaterInputStream 问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多