Friday, August 26, 2022

How to Untar a File in Java

In this post we'll see a Java program showing how to untar a tar file. It has both the steps to first decompress a .tar.gz file and later untar it.

Using Apache Commons Compress

Apache Commons Compress library is used in the code for untarring a file. You can download it from here \– https://commons.apache.org/proper/commons-compress/download_compress.cgi.

Make sure to add commons-compress-xxx.jar in your application’s class path. I have used commons-compress-1.13 version.

Java example to untar a file

This Java program has two methods deCompressGZipFile() method is used to decompress a .tar.gz file to get a .tar file. Using unTarFile() method this .tar file is untarred.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.utils.IOUtils;

public class UnTarDemo {
  public static void main(String[] args) {
    // Path to input file, which is a 
    // tar file compressed to create gzip file
    String INPUT_FILE = "G:\\Test.tar.gz";
    // This folder should exist, that's where
    // .tar file will go
    String TAR_FOLDER = "G:\\TarFile";
    // After untar files will go to this folder
    String DESTINATION_FOLDER = "G:\\Temp";
    UnTarDemo unTarDemo = new UnTarDemo();
    try {
      File inputFile = new File(INPUT_FILE);
      String outputFile = getFileName(inputFile, TAR_FOLDER);
      System.out.println("outputFile " + outputFile);
      File tarFile = new File(outputFile);
      // Calling method to decompress file
      tarFile = unTarDemo.deCompressGZipFile(inputFile, tarFile);
      File destFile = new File(DESTINATION_FOLDER);
      if(!destFile.exists()){
        destFile.mkdir();
      }
      // Calling method to untar file
      unTarDemo.unTarFile(tarFile, destFile);            
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
    
  /**
   * 
   * @param tarFile
   * @param destFile
   * @throws IOException
   */
  private void unTarFile(File tarFile, File destFile) throws IOException{
    FileInputStream fis = new FileInputStream(tarFile);
    TarArchiveInputStream tis = new TarArchiveInputStream(fis);
    TarArchiveEntry tarEntry = null;
        
    // tarIn is a TarArchiveInputStream
    while ((tarEntry = tis.getNextTarEntry()) != null) {
      File outputFile = new File(destFile + File.separator + tarEntry.getName());        
      if(tarEntry.isDirectory()){            
        System.out.println("outputFile Directory ---- " 
            + outputFile.getAbsolutePath());
        if(!outputFile.exists()){
          outputFile.mkdirs();
        }
      }else{
        //File outputFile = new File(destFile + File.separator + tarEntry.getName());
        System.out.println("outputFile File ---- " + outputFile.getAbsolutePath());
        outputFile.getParentFile().mkdirs();
        //outputFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(outputFile); 
        IOUtils.copy(tis, fos);
        fos.close();
      }
    }
    tis.close();
  }
    
  /**
   * Method to decompress a gzip file
   * @param gZippedFile
   * @param newFile
   * @throws IOException
   */
  private File deCompressGZipFile(File gZippedFile, File tarFile) throws IOException{
    FileInputStream fis = new FileInputStream(gZippedFile);
    GZIPInputStream gZIPInputStream = new GZIPInputStream(fis);
    
    FileOutputStream fos = new FileOutputStream(tarFile);
    byte[] buffer = new byte[1024];
    int len;
    while((len = gZIPInputStream.read(buffer)) > 0){
      fos.write(buffer, 0, len);
    }        
    fos.close();
    gZIPInputStream.close();
    return tarFile;               
  }
    
  /**
   * This method is used to get the tar file name from the gz file
   * by removing the .gz part from the input file
   * @param inputFile
   * @param outputFolder
   * @return
   */
  private static String getFileName(File inputFile, String outputFolder){
    return outputFolder + File.separator + 
      inputFile.getName().substring(0, inputFile.getName().lastIndexOf('.'));
  }
}

That's all for this topic How to Untar a File in Java. If you have any doubt or any suggestions to make please drop a comment. Thanks!

>>>Return to Java Programs Page


Related Topics

  1. Creating Tar File And GZipping Multiple Files in Java
  2. Zipping Files And Folders in Java
  3. How to Create Password Protected Zip File in Java
  4. Compressing and Decompressing File in GZIP Format
  5. How to Read File From The Last Line in Java

You may also like-

  1. Reading File in Java Using Files.lines And Files.newBufferedReader
  2. Write to a File in Java
  3. Producer-Consumer Java Program Using volatile
  4. How to Inject Prototype Scoped Bean into a Singleton Bean in Spring
  5. Spring NamedParameterJdbcTemplate Insert, Update And Delete Example
  6. Interface Default Methods in Java
  7. Lambda Expressions in Java 8
  8. StringBuffer Class in Java With Examples