How to Compress/Decompress tar.gz files in java

前端 未结 7 1082
粉色の甜心
粉色の甜心 2020-12-02 17:05

Can anyone show me the correct way to compress and decompress tar.gzip files in java i\'ve been searching but the most i can find is either zip or gzip(alone).

相关标签:
7条回答
  • 2020-12-02 17:17

    To extract the contents of .tar.gz format, I successfully use apache commons-compress ('org.apache.commons:commons-compress:1.12'). Take a look at this example method:

    public void extractTarGZ(InputStream in) {
        GzipCompressorInputStream gzipIn = new GzipCompressorInputStream(in);
        try (TarArchiveInputStream tarIn = new TarArchiveInputStream(gzipIn)) {
            TarArchiveEntry entry;
    
            while ((entry = (TarArchiveEntry) tarIn.getNextEntry()) != null) {
                /** If the entry is a directory, create the directory. **/
                if (entry.isDirectory()) {
                    File f = new File(entry.getName());
                    boolean created = f.mkdir();
                    if (!created) {
                        System.out.printf("Unable to create directory '%s', during extraction of archive contents.\n",
                                f.getAbsolutePath());
                    }
                } else {
                    int count;
                    byte data[] = new byte[BUFFER_SIZE];
                    FileOutputStream fos = new FileOutputStream(entry.getName(), false);
                    try (BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER_SIZE)) {
                        while ((count = tarIn.read(data, 0, BUFFER_SIZE)) != -1) {
                            dest.write(data, 0, count);
                        }
                    }
                }
            }
    
            System.out.println("Untar completed successfully!");
        }
    }
    
    0 讨论(0)
  • 2020-12-02 17:18

    In my experience Apache Compress is much more mature than Plexus Archiver, specifically because of issues like http://jira.codehaus.org/browse/PLXCOMP-131.

    I believe Apache Compress has more activity as well.

    0 讨论(0)
  • 2020-12-02 17:20

    It works for me, using GZIPInputStream, https://www.mkyong.com/java/how-to-decompress-file-from-gzip-file/

    0 讨论(0)
  • 2020-12-02 17:21

    I've written a wrapper for commons-compress called jarchivelib that makes it easy to extract or compress from and into File objects.

    Example code would look like this:

    File archive = new File("/home/thrau/archive.tar.gz");
    File destination = new File("/home/thrau/archive/");
    
    Archiver archiver = ArchiverFactory.createArchiver("tar", "gz");
    archiver.extract(archive, destination);
    
    0 讨论(0)
  • 2020-12-02 17:25

    If you are planning to compress/decompress on Linux, you can call the shell command line to do that for you:

    Files.createDirectories(Paths.get(target));
    ProcessBuilder builder = new ProcessBuilder();
    builder.command("sh", "-c", String.format("tar xfz %s -C %s", tarGzPathLocation, target));
    builder.directory(new File("/tmp"));
    Process process = builder.start();
    int exitCode = process.waitFor();
    assert exitCode == 0;
    
    0 讨论(0)
  • 2020-12-02 17:26

    My favorite is plexus-archiver - see sources on GitHub.

    Another option is Apache commons-compress - (see mvnrepository).

    With plexus-utils, the code for unarchiving looks like this:

    final TarGZipUnArchiver ua = new TarGZipUnArchiver();
    // Logging - as @Akom noted, logging is mandatory in newer versions, so you can use a code like this to configure it:
    ConsoleLoggerManager manager = new ConsoleLoggerManager();
    manager.initialize();
    ua.enableLogging(manager.getLoggerForComponent("bla"));
    // -- end of logging part
    ua.setSourceFile(sourceFile);
    destDir.mkdirs();
    ua.setDestDirectory(destDir);
    ua.extract();
    

    Similar *Archiver classes are there for archiving.

    With Maven, you can use this dependency:

    <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-archiver</artifactId>
      <version>2.2</version>
    </dependency>
    
    0 讨论(0)
提交回复
热议问题