Java使用zlib deflate解压缩字符串

9
如标题所述,如何解压使用zlib deflate算法压缩的字符串?请提供一种可靠方法并加以解释。
2个回答

16

试试这个 - 这是一个最小的工作示例:

package zlib.example;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.InflaterInputStream;

/**
 * Created by keocra on 08.10.15.
 */
public class Main {
    private final static String inputStr = "Hello World!";

    public static void main(String[] args) throws Exception {
        System.out.println("Will zlib compress following string: " + inputStr);

        // will compress "Hello World!"
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DeflaterOutputStream dos = new DeflaterOutputStream(baos);
        dos.write(inputStr.getBytes());
        dos.flush();
        dos.close();

        // at this moment baos.toByteArray() holds the compressed data of "Hello World!"

        // will decompress compressed "Hello World!"
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        InflaterInputStream iis = new InflaterInputStream(bais);

        String result = "";
        byte[] buf = new byte[5];
        int rlen = -1;
        while ((rlen = iis.read(buf)) != -1) {
            result += new String(Arrays.copyOf(buf, rlen));
        }

        // now result will contain "Hello World!"

        System.out.println("Decompress result: " + result);
    }
}

你也应该很容易地将这个例子扩展到压缩/解压缩文件。

希望对你有所帮助;-)

更多阅读:


请更具体地说明您想要做什么。上面的示例并没有限制特定的字符串长度。为了明确:只需更改inputStr即可。如果您想调整示例,还应将字节缓冲区(...new byte [5])更改为例如new byte [1024]。 - keocra
那么 byte[] buf 在做什么呢? - user4942382
1
我回答稍微晚了一些;-) byte[] buf = new byte[5]; 初始化一个空的字节数组,作为从输入流中读取的缓冲区。 iis.read(buf) 然后每次读取最多5个字节的输入流。 Arrays.copyOf(buf, rlen) 只拷贝实际读取的字节数量。 例如,假设你的输入流有23个字节。每次读取五个字节会导致实际上有4轮读取5个字节,而最后一轮只读取3个字节。因此,在最后一个回合中,我们只关心buf对象的三个字节。 - keocra

2

我在谷歌上找到了这篇文章,它解释了如何使用zlib在Java中进行压缩和解压缩,希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接