Saúl, parte de nuestro equipo, nos ha hecho el favor de crear esta reseña ya que controla perfectamente el tema.
Solución:
He escrito un contenedor para commons-compress llamado jarchivelib que facilita la extracción o la compresión desde y hacia File
objetos.
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: consulte las 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();
Hay clases similares de *Archiver para archivar.
Con Maven, puede usar esta dependencia:
org.codehaus.plexus
plexus-archiver
2.2
Para extraer el contenido del formato .tar.gz, uso con éxito apache commons-comprimir (‘org.apache.commons:commons-compress:1.12’). Echa 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!");
Sección de Reseñas y Valoraciones
Al final de todo puedes encontrar las aclaraciones de otros desarrolladores, tú aún tienes la opción de insertar el tuyo si lo crees conveniente.