web-dev-qa-db-fra.com

Comment compresser/décompresser des fichiers tar.gz en java

Quelqu'un peut-il me montrer le bon moyen de compresser et de décompresser les fichiers tar.gzip en Java que je cherchais mais le plus que je puisse trouver est Zip ou gzip (seul) 

34
kdgwill

Mon préféré est plexus-archiver - voir les sources sur GitHub .

Une autre option est Apache commons-compress - (voir mvnrepository ).

Avec plexus-utils, le code de désarchivage ressemble à ceci: 

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();

Des classes similaires * Archiveur sont là pour l'archivage.

Avec Maven, vous pouvez utiliser cette dépendance :

<dependency>
  <groupId>org.codehaus.plexus</groupId>
  <artifactId>plexus-archiver</artifactId>
  <version>2.2</version>
</dependency>
27
Petr Kozelka

J'ai écrit un wrapper pour commons-compress appelé jarchivelib qui facilite l'extraction ou la compression depuis et vers des objets File.

Exemple de code ressemblerait à ceci:

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);
30
thrau

Pour extraire le contenu du format .tar.gz, j'ai utilisé avec succès Apache commons-compress ('org.Apache.commons: commons-compress: 1.12'). Jetez un oeil à cet exemple de méthode:

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!");
    }
}
9
RemusS

D'après mon expérience, Apache Compress est beaucoup plus mature que Plexus Archiver , en raison notamment de problèmes comme http://jira.codehaus.org/browse/PLXCOMP-131 .

Je pense qu'Apache Compress a également plus d'activité.

7
Gili

Si vous envisagez de compresser/décompresser sous Linux, vous pouvez appeler la ligne de commande Shell:

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
Dherik

Avec TrueVFS , l'extraction de l'archive Tar.GZip est one-liner:

new TFile("archive.tar.gz").cp_rp(new File("dest/folder"));

Mais méfiez-vous de la question dependencies .

0
Vadzim