Quantcast
Channel: Baeldung
Viewing all articles
Browse latest Browse all 4535

Compress and Uncompress Byte Array Using Deflater/Inflater

$
0
0

1. Overview

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.

In this short tutorial, we’ll explore how to use these classes with a simple example.

2. Compressing

The Deflater class uses the ZLIB compression library to compress data. Let’s see it in action:

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:

  • 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:

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

3. Uncompressing

Next, let’s decompress a byte array with the Inflater class:

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:

  • 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

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

In this article, we’ve learned how to compress and uncompress a Java byte array using the Deflater and Inflater classes, respectively.

The example code from this article can be found over on GitHub.

       

Viewing all articles
Browse latest Browse all 4535

Trending Articles