This article shows how to use Java to compress a file in Gzip format.
1. What is Gzip?
GZip is a standard file compression tool on Unix or Linux system, and generally has the suffix .gz.
2. Why we need to compress a file in Gzip?
Answer: Smaller file size, save disk space.
3. How about tar.gz?Gzip compress a single file, and the Tar is collecting files into one archive file, visit this article to Create tar.gz in Java
1. Compress a file in Gzip – GZIPOutputStream
We copy the FileInputStream into a GZIPOutputStream to compress a file in Gzip format.
1.1 The below example compresses a file sitemap.xml into a Gzip file sitemap.xml.gz.
GZipExample.java
package com.favtuts.io.howto.compress;
import java.io.*;
import java.nio.file.*;
import java.util.zip.*;
public class GZipExample {
public static void main(String[] args) {
// compress a file
Path source = Paths.get("/home/tvt/workspace/favtuts/sitemap.xml");
Path target = Paths.get("/home/tvt/workspace/favtuts/sitemap.xml.gz");
if (Files.notExists(source)) {
System.err.printf("The path %s doesn't exist!", source);
return;
}
try {
GZipExample.compressGzip(source, target);
} catch (IOException e) {
e.printStackTrace();
}
}
// copy file (FileInputStream) to GZIPOutputStream
public static void compressGzip(Path source, Path target) throws IOException {
try (GZIPOutputStream gos = new GZIPOutputStream(
new FileOutputStream(target.toFile()));
FileInputStream fis = new FileInputStream(source.toFile())) {
// copy file
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
gos.write(buffer, 0, len);
}
}
}
}
Output, the XML file is compressed in Gzip format, and the file size drops from 256K to 1.3K.
$ pwd
/home/tvt/workspace/favtuts
$ ls -lsah sitemap.*
256K -rw-rw-r-- 1 tvt tvt 255K Thg 5 20 16:15 sitemap.xml
4,0K -rw-rw-r-- 1 tvt tvt 1,4K Thg 5 20 16:16 sitemap.xml.gz
$ gzip -l sitemap.xml.gz
compressed uncompressed ratio uncompressed_name
1394 260295 99.5% sitemap.xml
1.2 This example is similar to example 1.1. Instead, we use NIO Files.copy to copy a Path to GZIPOutputStream directly.
public static void compressGzipNio(Path source, Path target) throws IOException {
try (GZIPOutputStream gos = new GZIPOutputStream(
new FileOutputStream(target.toFile()))) {
Files.copy(source, gos);
}
}
2. Compress a String to Gzip
2.1 This example compresses a String into a Gzip file.
public static void compressStringToGzip(String data, Path target) throws IOException {
try (GZIPOutputStream gos = new GZIPOutputStream(
new FileOutputStream(target.toFile()))) {
gos.write(data.getBytes(StandardCharsets.UTF_8));
}
}
Further Reading
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-io/howto/compress