1. 概述
数据压缩是软件开发中至关重要的一环,它能够有效地存储和传输信息。在Java中,java.util.zip
包下的Deflater
和Inflater
类提供了一种简单的方式来压缩和解压缩字节数组。
在这篇简短教程中,我们将通过一个示例来探索如何使用这些类。
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. 总结
在这篇文章中,我们学习了如何使用Deflater
和Inflater
类分别压缩和解压缩Java字节数组。
本文的示例代码可以在GitHub上找到。