1. 概述

数据压缩是软件开发中至关重要的一环,它能够有效地存储和传输信息。在Java中,java.util.zip包下的DeflaterInflater类提供了一种简单的方式来压缩和解压缩字节数组。

在这篇简短教程中,我们将通过一个示例来探索如何使用这些类。

2. 压缩

Deflater类使用ZLIB压缩库对数据进行压缩。让我们来看一个实例:

public static byte[] compress(byte[] input) {
    Deflater deflater = new Deflater();
    deflater.setInput(input);
    deflater.finish();

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];

    while (!deflater.finished()) {
        int compressedSize = deflater.deflate(buffer);
        outputStream.write(buffer, 0, compressedSize);
    }

    return outputStream.toByteArray();
}

在上面的代码中,我们使用了Deflater类的几个方法来压缩输入数据:

  • setInput():设置压缩输入数据
  • finish():表示应以当前输入内容结束压缩
  • deflate():压缩数据并填充到指定缓冲区,然后返回实际压缩后的字节数
  • finished():检查是否已达到压缩数据输出流的末尾

此外,我们还可以使用setLevel()方法获得更好的压缩效果。可以传递0到9的值,对应于无压缩到最佳压缩的范围:

Deflater deflater = new Deflater();
deflater.setInput(input);
deflater.setLevel(5);

3. 解压缩

接下来,我们使用Inflater类来解压缩一个字节数组:

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

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];

    while (!inflater.finished()) {
        int decompressedSize = inflater.inflate(buffer);
        outputStream.write(buffer, 0, decompressedSize);
    }

    return outputStream.toByteArray();
}

这次我们使用了Inflater类的三个方法:

  • setInput():设置解压缩输入数据
  • finished():检查是否已达到压缩数据流的末尾
  • inflate():将字节解压缩到指定缓冲区,并返回实际解压缩的字节数

4. 示例

让我们用这个简单的例子尝试一下我们的方法:

String inputString = "Baeldung helps developers explore the Java ecosystem and simply be better engineers. "
  + "We publish to-the-point guides and courses, with a strong focus on building web applications, Spring, "
  + "Spring Security, and RESTful APIs";
byte[] input = inputString.getBytes();

byte[] compressedData = compress(input);

byte[] decompressedData = decompress(compressedData);

System.out.println("Original: " + input.length + " bytes");
System.out.println("Compressed: " + compressedData.length + " bytes");
System.out.println("Decompressed: " + decompressedData.length + " bytes");

assertEquals(input.length, decompressedData.length);

结果会如下所示:

Original: 220 bytes
Compressed: 168 bytes
Decompressed: 220 bytes

5. 总结

在这篇文章中,我们学习了如何使用DeflaterInflater类分别压缩和解压缩Java字节数组。

本文的示例代码可以在GitHub上找到。