Comment extraire un fichier tar (ou tar.gz ou tar.bz2) en Java?
Remarque: cette fonctionnalité a été publiée ultérieurement dans un projet distinct, Apache Commons Compress, comme décrit dans une autre réponse. Cette réponse est obsolète.
Je n’ai pas utilisé directement une API tar, mais tar et bzip2 sont implémentés dans Ant; vous pouvez emprunter leur implémentation ou utiliser Ant pour faire ce dont vous avez besoin.
Gzip fait partie de Java SE (et je suppose que l’implémentation Ant suit le même modèle).
GZIPInputStream
est juste un décorateur InputStream
. Vous pouvez, par exemple, FileInputStream
un object FileInputStream
dans un GZIPInputStream
et l’utiliser de la même façon que vous utiliseriez un InputStream
:
InputStream is = new GZIPInputStream(new FileInputStream(file));
(Notez que GZIPInputStream a son propre tampon interne, donc le fait d’ FileInputStream
dans un BufferedInputStream
réduirait probablement les performances.)
Vous pouvez le faire avec la bibliothèque Apache Commons Compress. Vous pouvez télécharger la version 1.2 à l’ adresse http://mvnrepository.com/artifact/org.apache.commons/commons-compress/1.2 .
Voici deux méthodes: une qui décompresse un fichier et une autre qui la décompose. Donc, pour un fichier
Prendre plaisir.
/** Untar an input file into an output file. * The output file is created in the output folder, having the same name * as the input file, minus the '.tar' extension. * * @param inputFile the input .tar file * @param outputDir the output directory file. * @throws IOException * @throws FileNotFoundException * * @return The {@link List} of {@link File}s with the untared content. * @throws ArchiveException */ private static List unTar(final File inputFile, final File outputDir) throws FileNotFoundException, IOException, ArchiveException { LOG.info(Ssortingng.format("Untaring %s to dir %s.", inputFile.getAbsolutePath(), outputDir.getAbsolutePath())); final List untaredFiles = new LinkedList (); final InputStream is = new FileInputStream(inputFile); final TarArchiveInputStream debInputStream = (TarArchiveInputStream) new ArchiveStreamFactory().createArchiveInputStream("tar", is); TarArchiveEntry entry = null; while ((entry = (TarArchiveEntry)debInputStream.getNextEntry()) != null) { final File outputFile = new File(outputDir, entry.getName()); if (entry.isDirectory()) { LOG.info(Ssortingng.format("Attempting to write output directory %s.", outputFile.getAbsolutePath())); if (!outputFile.exists()) { LOG.info(Ssortingng.format("Attempting to create output directory %s.", outputFile.getAbsolutePath())); if (!outputFile.mkdirs()) { throw new IllegalStateException(Ssortingng.format("Couldn't create directory %s.", outputFile.getAbsolutePath())); } } } else { LOG.info(Ssortingng.format("Creating output file %s.", outputFile.getAbsolutePath())); final OutputStream outputFileStream = new FileOutputStream(outputFile); IOUtils.copy(debInputStream, outputFileStream); outputFileStream.close(); } untaredFiles.add(outputFile); } debInputStream.close(); return untaredFiles; } /** * Ungzip an input file into an output file. * * The output file is created in the output folder, having the same name * as the input file, minus the '.gz' extension. * * @param inputFile the input .gz file * @param outputDir the output directory file. * @throws IOException * @throws FileNotFoundException * * @return The {@File} with the ungzipped content. */ private static File unGzip(final File inputFile, final File outputDir) throws FileNotFoundException, IOException { LOG.info(Ssortingng.format("Ungzipping %s to dir %s.", inputFile.getAbsolutePath(), outputDir.getAbsolutePath())); final File outputFile = new File(outputDir, inputFile.getName().subssortingng(0, inputFile.getName().length() - 3)); final GZIPInputStream in = new GZIPInputStream(new FileInputStream(inputFile)); final FileOutputStream out = new FileOutputStream(outputFile); IOUtils.copy(in, out); in.close(); out.close(); return outputFile; }
Apache Commons VFS prend en charge tar comme un système de fichiers virtuel , qui prend en charge des URL telles que celle-ci tar:gz: http://anyhost/dir/mytar.tar.gz!/mytar.tar!/path/in/tar/README.txt
TrueZip ou son successeur TrueVFS fait de même … il est également disponible auprès de Maven Central.
Archiver archiver = ArchiverFactory.createArchiver("tar", "gz"); archiver.extract(archiveFile, destDir);
Dépendance:
org.rauschig jarchivelib 0.5.0
Je viens d’essayer un certain nombre de bibliothèques suggérées (TrueZip, Apache Compress), mais pas de chance.
Voici un exemple avec Apache Commons VFS:
FileSystemManager fsManager = VFS.getManager(); FileObject archive = fsManager.resolveFile("tgz:file://" + fileName); // List the children of the archive file FileObject[] children = archive.getChildren(); System.out.println("Children of " + archive.getName().getURI()+" are "); for (int i = 0; i < children.length; i++) { FileObject fo = children[i]; System.out.println(fo.getName().getBaseName()); if (fo.isReadable() && fo.getType() == FileType.FILE && fo.getName().getExtension().equals("nxml")) { FileContent fc = fo.getContent(); InputStream is = fc.getInputStream(); } }
Et la dépendance maven:
commons-vfs commons-vfs 1.0
En plus de gzip et de bzip2, l’ API Apache Commons Compress prend également en charge le tar, à l’origine basé sur le package Java Tar de ICE Engineering , à la fois API et outil autonome.
Qu’en est-il de l’utilisation de cette API pour les fichiers tar, cet autre inclus dans Ant pour BZIP2 et le standard pour GZIP?