it-swarm.com.de

Wie komprimiere/dekomprimiere tar.gz-Dateien in Java

Kann mir jemand zeigen, wie ich tar.gzip-Dateien in Java richtig komprimieren und dekomprimieren kann? 

34
kdgwill

Mein Favorit ist Plexus-Archivierer - siehe Quellen auf GitHub .

Eine andere Option ist Apache commons-compress - (siehe mvnrepository ).

Bei Plexus-Utils sieht der Code zum Aufheben der Archivierung folgendermaßen aus: 

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

* Archiver-Klassen stehen zur Archivierung zur Verfügung.

Mit Maven können Sie diese Abhängigkeit verwenden:

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

Ich habe einen Wrapper für commons-compress namens jarchivelib geschrieben, der das Extrahieren oder Komprimieren von File-Objekten erleichtert.

Beispielcode würde so aussehen:

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

Um den Inhalt des .tar.gz-Formats zu extrahieren, verwende ich erfolgreich Apache commons-compress ('org.Apache.commons: commons-compress: 1.12'). Schauen Sie sich diese Beispielmethode an:

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

Nach meiner Erfahrung ist Apache Compress viel reifer als Plexus Archiver , insbesondere wegen Problemen wie http://jira.codehaus.org/browse/PLXCOMP-131 .

Ich glaube, Apache Compress hat auch mehr Aktivität.

7
Gili

Wenn Sie unter Linux komprimieren/dekomprimieren möchten, können Sie die Shell-Befehlszeile aufrufen:

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

Mit TrueVFS extrahieren ist das Tar.GZip-Archiv einzeilig:

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

Aber hüte dich vor Abhängigkeiten Problem .

0
Vadzim