当前位置:  开发笔记 > 编程语言 > 正文

如何在Java中提取tar文件?

如何解决《如何在Java中提取tar文件?》经验,为你挑选了6个好方法。

如何在Java中提取tar(或tar.gz或tar.bz2)文件?



1> Dan Borza..:

您可以使用Apache Commons Compress库执行此操作.您可以从http://mvnrepository.com/artifact/org.apache.commons/commons-compress/1.2下载1.2版本.

这里有两种方法:一种解压缩文件,另一种解压缩文件.因此,对于文件 tar.gz,您需要先将其解压缩,然后解压缩它.请注意,tar存档也可能包含文件夹,需要在本地文件系统上创建它们.

请享用.

/** 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(String.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(String.format("Attempting to write output directory %s.", outputFile.getAbsolutePath()));
            if (!outputFile.exists()) {
                LOG.info(String.format("Attempting to create output directory %s.", outputFile.getAbsolutePath()));
                if (!outputFile.mkdirs()) {
                    throw new IllegalStateException(String.format("Couldn't create directory %s.", outputFile.getAbsolutePath()));
                }
            }
        } else {
            LOG.info(String.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(String.format("Ungzipping %s to dir %s.", inputFile.getAbsolutePath(), outputDir.getAbsolutePath())); final File outputFile = new File(outputDir, inputFile.getName().substring(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; }


当OutputStream outputFileStream = new FileOutputStream(outputFile)时,我遇到了'系统无法找到指定的路径'的问题; 修复只需添加File parent = outputFile.getParentFile(); if(!parent.exists())parent.mkdirs();

2> erickson..:

注意:此功能后来通过另一个项目Apache Commons Compress发布,如另一个答案中所述.这个答案已经过时了.


我没有直接使用tar API,但是在Ant中实现了tar和bzip2; 你可以借用他们的实现,或者可能使用Ant来做你需要的.

Gzip是Java SE的一部分(我猜测Ant实现遵循相同的模型).

GZIPInputStream只是一个InputStream装饰.你可以用,例如,FileInputStream在一个GZIPInputStream和你使用任何以同样的方式使用它InputStream:

InputStream is = new GZIPInputStream(new FileInputStream(file));

(请注意,GZIPInputStream有自己的内部缓冲区,因此包装FileInputStreama BufferedInputStream可能会降低性能.)


捆绑在'ant'中的Apache类工作正常.我每天都使用它:org.apache.tools.tar.TarEntry和org.apache.tools.tar.TarInputStream; 代码与解压缩zip文件的代码非常相似.如果你想做Bzip2,请使用jaxlib.
我正打算告诉他有关GZIPInputStream的事.但它不会帮助他,因为他仍然需要阅读包含的.tar文件:)

3> Jörg..:

Apache Commons VFS支持tar作为虚拟文件系统,它支持像这样的URLtar:gz:http://anyhost/dir/mytar.tar.gz!/mytar.tar!/path/in/tar/README.txt

TrueZip或其后继者TrueVFS也是如此......它也可以从Maven Central获得.



4> 小智..:
Archiver archiver = ArchiverFactory.createArchiver("tar", "gz");
archiver.extract(archiveFile, destDir);

相关性:

 
        org.rauschig
        jarchivelib
        0.5.0



5> Renaud..:

我刚尝试了一堆建议的libs(TrueZip,Apache Compress),但没有运气.

以下是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();
    }
}

和maven依赖:

    
      commons-vfs
      commons-vfs
      1.0
    



6> Jörg..:

除了gzip和bzip2之外,Apache Commons Compress API还支持tar,最初基于ICE Engineering Java Tar Package,它既是API又是独立工具.


我的测试显示ICE焦油是五个竞争者中最快的(冰,压缩,蚂蚁,xeus + vfs),而Commons Compress排在第二位......然而,ICE tar似乎不那么可靠的WRT完整性解包所有条目和WRT保持归档条目原始文件名.
推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有