para - Cómo comprimir/descomprimir archivos tar.gz en java
descomprimir archivos rar para java (6)
¿Alguien me puede mostrar la forma correcta de comprimir y descomprimir los archivos tar.gzip en java que he estado buscando pero lo más que puedo encontrar es zip o gzip (solo)?
En mi experiencia, commons-compress es mucho más maduro que Plexus Archiver , específicamente debido a problemas como jira.codehaus.org/browse/PLXCOMP-131 .
Creo que Apache Compress también tiene más actividad.
Funciona para mí, usando GZIPInputStream
, https://www.mkyong.com/java/how-to-decompress-file-from-gzip-file/
He escrito un contenedor para commons-compress llamado jarchivelib que hace que sea fácil de extraer o comprimir desde y hacia objetos File
.
El código de ejemplo se vería así:
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);
Mi favorito es plexus-archiver - ver fuentes en GitHub .
Otra opción es Apache commons-compress - (ver mvnrepository ).
Con plexus-utils, el código para desarchivar se ve así:
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();
Similares * Las clases de Archiver están ahí para archivar.
Con Maven, puedes usar esta dependency :
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-archiver</artifactId>
<version>2.2</version>
</dependency>
Para extraer el contenido del formato .tar.gz, uso con éxito apache commons-compress (''org.apache.commons: commons-compress: 1.12''). Eche un vistazo a este método de ejemplo:
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!");
}
}
Si planea comprimir / descomprimir en Linux, puede llamar a la línea de comandos del 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;