zip
Compress – Decompress files example
This is an example of how to zip and unzip a file. We have implemented the FileCompressionUtil class, that consists of four methods, that zip and unzip a file with or without a checksum.
- The first method
- The method creates a ZipOutputStream, using a FileOutputStream, with the given zipFilename.
- It creates a new File with the given file path.
- It takes an array of strings naming the files and directories in the directory, using the
list()
API method of File, and puts them in a List of Strings, using theasList(String... a)
API method of the Arrays Class. - For each one of the files in the list it creates a BufferedInputStream using a FileInputStream and a specified buffer size.
- The zipOutputStream begins writing a new ZipEntry, using
putNextEntry(ZipEntry e)
API method and as parameter a new ZipEntry created for the specified file. - While the BufferedInputStream reads bytes from the file, into a specified byte array, with
read(byte[] b, int off, int len)
API method, the ZipoutputStream writes it to the specified ZipEntry, withwrite(byte[] b, int off, int len)
API method. - Finally, the all input and output streams close, using their
close()
API methods.
zipFilesInPath(final String zipFileName, final String filePath)
zips a file in a specific path.- The second method
- It follows the same steps as the first one, but it also uses a CheckedOutputStream with the intitial FileOutputStream and a new CRC32 Checksum, in order to create the ZipOutputStream that will write to the zip file.
- The method returns the value of the new checksum, using
getCheckSum()
API method of CheckedOutputStream and thengetValue()
API method of Checksum.
zipFilesInPathWithChecksum(final String zipFileName, final String folderPath)
zips a file in a specific path, using a checksum.- The third method
- It reads each ZipEntry object of the ZipInputStream, with
getNextEntry()
API method of ZipInputStream and for each ZipEntry it creates a BufferedOutputStream, using a FileOutputStream with the path of the extracted file. - While the ZipInputStream reads from the current ZIP entry into an array of bytes the BufferedOutputStream writes the byte array.
- When finished, the BufferedOutputStream flushes, with its
flush()
API method and finally all input and output streams close, using theirclose()
API methods.
unzipFilesToPath(final String zipFileName, final String fileExtractPath)
unzips files to a specified path. It creates a ZipInputStream, using a FileInputStream for the given zipfilename.- The last method
- It follows the same steps as the previous one, but it also creates a CheckedInputStream with the intitial FileInputStream and a new CRC32 Checksum, in order to create the ZipInputStream that will read from the zip file.
- It returns true if the checksum of the CheckedInputStream is the same as the checksum given as parameter to the method.
unzipFilesToPathWithChecksum(final String zipFileName, final String fileExtractPath, final long checksum)
unzips files to a specified path, using a checksum.Let’s take a look at the code snippet that follows:
package javaitzen.blog; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.zip.CRC32; import java.util.zip.CheckedInputStream; import java.util.zip.CheckedOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; /** * The Class FileCompressionUtil. */ public class FileCompressionUtil { private static final String PATH_SEP = "\"; public static final int BUFFER = 2048; private FileCompressionUtil() {} /** * Zip files in path. * * @param zipFileName the zip file name * @param filePath the file path * @throws IOException Signals that an I/O exception has occurred. */ public static void zipFilesInPath(final String zipFileName, final String filePath) throws IOException { final FileOutputStream dest = new FileOutputStream(zipFileName); final ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); try { byte[] data = new byte[BUFFER]; final File folder = new File(filePath); final List< String > files = Arrays.asList(folder.list()); for (String file : files) { final FileInputStream fi = new FileInputStream(filePath + PATH_SEP + file); final BufferedInputStream origin = new BufferedInputStream(fi, BUFFER); out.putNextEntry(new ZipEntry(file)); int count; while ((count = origin.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } origin.close(); fi.close(); } } finally { out.close(); dest.close(); } } /** * Zip with checksum. CRC32 * * @param zipFileName the zip file name * @param folderPath the folder path * @return the checksum * @throws IOException Signals that an I/O exception has occurred. */ public static long zipFilesInPathWithChecksum(final String zipFileName, final String folderPath) throws IOException { final FileOutputStream dest = new FileOutputStream(zipFileName); final CheckedOutputStream checkStream = new CheckedOutputStream(dest, new CRC32()); final ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(checkStream)); try { byte[] data = new byte[BUFFER]; final File folder = new File(folderPath); final List< String > files = Arrays.asList(folder.list()); for (String file : files) { final FileInputStream fi = new FileInputStream(folderPath + PATH_SEP + file); final BufferedInputStream origin = new BufferedInputStream(fi, BUFFER); out.putNextEntry(new ZipEntry(file)); int count; while ((count = origin.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } origin.close(); } } finally { out.close(); checkStream.close(); dest.flush(); dest.close(); } return checkStream.getChecksum().getValue(); } /** * Unzip files to path. * * @param zipFileName the zip file name * @param fileExtractPath the file extract path * @throws IOException Signals that an I/O exception has occurred. */ public static void unzipFilesToPath(final String zipFileName, final String fileExtractPath) throws IOException { final FileInputStream fis = new FileInputStream(zipFileName); final ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); try { ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { int count; byte[] data = new byte[BUFFER]; final FileOutputStream fos = new FileOutputStream(fileExtractPath + PATH_SEP + entry.getName()); final BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER); while ((count = zis.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); } } finally { fis.close(); zis.close(); } } /** * Unzip files to path with checksum. CRC32 * * @param zipFileName the zip file name * @param fileExtractPath the file extract path * @param checksum the checksum * @return true, if checksum matches; * @throws IOException Signals that an I/O exception has occurred. */ public static boolean unzipFilesToPathWithChecksum(final String zipFileName, final String fileExtractPath, final long checksum) throws IOException { boolean checksumMatches = false; final FileInputStream fis = new FileInputStream(zipFileName); final CheckedInputStream checkStream = new CheckedInputStream(fis, new CRC32()); final ZipInputStream zis = new ZipInputStream(new BufferedInputStream(checkStream)); try { ZipEntry entry = null; while ((entry = zis.getNextEntry()) != null) { int count; byte[] data = new byte[BUFFER]; final FileOutputStream fos = new FileOutputStream(fileExtractPath + PATH_SEP + entry.getName()); final BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER); while ((count = zis.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); } } finally { zis.close(); fis.close(); checkStream.close(); } if(checkStream.getChecksum().getValue() == checksum) { checksumMatches = true; } return checksumMatches; } }
This was an example of how to zip and unzip a file in Java.
Related Article:
Reference: Java Compression from our JCG partner Brian at Zen in the art of IT