1. Overview
1.概述
Data compression is a crucial aspect of software development that enables efficient storage and transmission of information. In Java, the Deflater and Inflater classes from the java.util.zip package provide a straightforward way to compress and decompress byte arrays.
数据压缩是软件开发的一个重要方面,它可以实现信息的高效存储和传输。在 Java 中,来自 java.util.zip 包的 Deflater 和 Inflater 类提供了压缩和解压缩字节数组的直接方法。
In this short tutorial, we’ll explore how to use these classes with a simple example.
在这个简短的教程中,我们将通过一个简单的示例来探讨如何使用这些类。
2. Compressing
2.压缩
The Deflater class uses the ZLIB compression library to compress data. Let’s see it in action:
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();
}
In the above code, we’ve used several methods of the Deflater class to compress the input data:
在上述代码中,我们使用了 Deflater 类的多个方法来压缩输入数据:
- setInput(): set input data for compression
- finish(): indicate that compression should end with the current contents of the input
- deflate(): compress the data and fill to a specified buffer, then return the actual number of bytes of compressed data
- finished(): check if the end of the compressed data output stream has been reached
Additionally, we can use the setLevel() method to get better compression results. We can pass values from 0 to 9, corresponding to the range from no compression to best compression:
此外,我们还可以使用 setLevel() 方法获得更好的压缩效果。我们可以传递从 0 到 9 的值,对应于从无压缩到最佳压缩的范围:
Deflater deflater = new Deflater();
deflater.setInput(input);
deflater.setLevel(5);
3. Uncompressing
3.解压缩
Next, let’s decompress a byte array with the Inflater class:
接下来,让我们使用 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();
}
This time, we used three methods of the Inflater class:
这次,我们使用了 Inflater 类的三个方法:
- setInput(): set input data for decompression
- finished(): check if the end of the compressed data stream has been reached
- inflate(): decompress bytes into the specified buffer and return the actual number of bytes uncompressed
4. Example
4.示例
Let’s try out our methods with this simple example:
让我们用这个简单的例子来试试我们的方法:
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);
The result will look like this:
结果将是这样的
Original: 220 bytes
Compressed: 168 bytes
Decompressed: 220 bytes
5. Conclusion
5.结论
In this article, we’ve learned how to compress and uncompress a Java byte array using the Deflater and Inflater classes, respectively.
在本文中,我们学习了如何分别使用 Deflater 和 Inflater 类压缩和解压缩 Java 字节数组。
The example code from this article can be found over on GitHub.