Before going through this section, please read the following articles:
Create tar.gz file in Java
Recursively list files in Java
The complete source code is given below:
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream; /** * Creating a tar.gz with apache commons-compress. **/ public class TarGZ { static final int BUFFER = 2048; /** * Command line arguments : * argv[0]-----> Source directory. * argv[1]-----> Destination tar.gz file. **/ public static void main(String[] args) { zipFile(args[0], args[1]); } public static void zipFile(String src, String dest) { FileOutputStream destination = null; BufferedOutputStream bOut = null; GzipCompressorOutputStream gzOut = null; TarArchiveOutputStream tOut = null; try { destination = new FileOutputStream(dest); } catch (FileNotFoundException e) { System.out.println("Output directory does not exist.."); e.printStackTrace(); } /** Step: 1 ---> create a TarArchiveOutputStream object. **/ try { bOut = new BufferedOutputStream(destination); gzOut = new GzipCompressorOutputStream(bOut); tOut = new TarArchiveOutputStream(gzOut); /** * Step: 2 --->Open the source data and get a list of files from * given directory recursively. **/ File source = new File(src); if (!source.exists()) { System.out.println("Input directory does not exist.."); System.exit(0); } zipFilesRecursively(source.getParentFile(), source, tOut); /** Step: 7 --->close the output stream. **/ tOut.close(); System.out.println("tar.gz file created successfully!!"); } catch (IOException e) { e.printStackTrace(); } } private static void zipFilesRecursively(File baseDir, File source, TarArchiveOutputStream out) throws IOException { if (source.isFile()) { System.out.println("Adding File: " + baseDir.toURI().relativize(source.toURI()).getPath()); FileInputStream fi = new FileInputStream(source); BufferedInputStream sourceStream = new BufferedInputStream(fi, BUFFER); /** Step: 3 ---> Create a tar entry for each file that is read. **/ /** * relativize is used to to add a file to a tar, without including * the entire path from root. **/ TarArchiveEntry entry = new TarArchiveEntry(source, baseDir .getParentFile().toURI().relativize(source.toURI()) .getPath()); /** Step: 4 ---> Put the tar entry using putArchiveEntry. **/ out.putArchiveEntry(entry); /** * Step: 5 ---> Write the data to the tar file and close the input * stream. **/ int count; byte data[] = new byte[BUFFER]; while ((count = sourceStream.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } sourceStream.close(); /** Step: 6 --->close the archive entry. **/ out.closeArchiveEntry(); } else { if (source.listFiles() != null) { /** Add an empty folder to the tar **/ if (source.listFiles().length == 0) { System.out.println("Adding Empty Folder: " + baseDir.toURI().relativize(source.toURI()) .getPath()); TarArchiveEntry entry = new TarArchiveEntry(source, baseDir .getParentFile().toURI().relativize(source.toURI()) .getPath()); out.putArchiveEntry(entry); out.closeArchiveEntry(); } for (File file : source.listFiles()) zipFilesRecursively(baseDir, file, out); } } } }
Won't line 59 cause the example to error out if the file source is on the root of a windows drive?
ReplyDeleteThis comment has been removed by the author.
ReplyDelete