Compress directory to tar.gz with Commons Compress

后端 未结 6 1392
终归单人心
终归单人心 2020-12-30 06:13

I\'m running into a problem using the commons compress library to create a tar.gz of a directory. I have a directory structure that is as follows.

parent/
          


        
6条回答
  •  再見小時候
    2020-12-30 06:35

    I had to make some adjustments to @merrick solution to get it to work related to the path. Perhaps with the latest maven dependencies. The currently accepted solution didn't work for me.

    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 java.util.ArrayList;
    import java.util.List;
    import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
    import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
    import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.io.IOUtils;
    import org.apache.commons.io.filefilter.DirectoryFileFilter;
    import org.apache.commons.io.filefilter.RegexFileFilter;
    
    public class TAR {
    
        public static void CreateTarGZ(String inputDirectoryPath, String outputPath) throws IOException {
    
            File inputFile = new File(inputDirectoryPath);
            File outputFile = new File(outputPath);
    
            try (FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
                    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
                    GzipCompressorOutputStream gzipOutputStream = new GzipCompressorOutputStream(bufferedOutputStream);
                    TarArchiveOutputStream tarArchiveOutputStream = new TarArchiveOutputStream(gzipOutputStream)) {
    
                tarArchiveOutputStream.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX);
                tarArchiveOutputStream.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
    
                List files = new ArrayList<>(FileUtils.listFiles(
                        inputFile,
                        new RegexFileFilter("^(.*?)"),
                        DirectoryFileFilter.DIRECTORY
                ));
    
                for (int i = 0; i < files.size(); i++) {
                    File currentFile = files.get(i);
    
                    String relativeFilePath = inputFile.toURI().relativize(
                            new File(currentFile.getAbsolutePath()).toURI()).getPath();
    
                    TarArchiveEntry tarEntry = new TarArchiveEntry(currentFile, relativeFilePath);
                    tarEntry.setSize(currentFile.length());
    
                    tarArchiveOutputStream.putArchiveEntry(tarEntry);
                    tarArchiveOutputStream.write(IOUtils.toByteArray(new FileInputStream(currentFile)));
                    tarArchiveOutputStream.closeArchiveEntry();
                }
                tarArchiveOutputStream.close();
            }
        }
    }
    

    Maven

            
                commons-io
                commons-io
                2.6
            
    
            
                org.apache.commons
                commons-compress
                1.18
            
    

提交回复
热议问题