【发布时间】:2017-04-04 17:19:35
【问题描述】:
用 Java 解压 Tar(或 BZip+Tar)档案的最简单方法。
Apache Commons Compress 有解压 Tar 的类。但是您必须遍历所有存档条目并将每个条目的 InputStream 保存到文件中。
有没有办法“在一行代码中”简单地从 Tar 存档中解压所有文件?
【问题讨论】:
标签: java tar apache-commons-compress
用 Java 解压 Tar(或 BZip+Tar)档案的最简单方法。
Apache Commons Compress 有解压 Tar 的类。但是您必须遍历所有存档条目并将每个条目的 InputStream 保存到文件中。
有没有办法“在一行代码中”简单地从 Tar 存档中解压所有文件?
【问题讨论】:
标签: java tar apache-commons-compress
我认为您最好的选择是作为子进程启动。这些库与文件系统条目一起使用。所以没有简单的方法可以在一行代码中做到这一点
ProcessBuilder pb = new ProcessBuilder();
pb.directory(new File("path to your tar"));
pb.command("tar", "-xzvf", "my tar");
pb.start();
【讨论】:
Plexus Archiver 可以做到。
但它也需要对plexus-container的依赖:
例子:
import org.codehaus.plexus.archiver.tar.TarUnArchiver;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.logging.console.ConsoleLogger;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.arrayContaining;
public class UnpackTarTest {
@Test
public void wholeTarAtOnce() throws IOException {
File srcFile = new File(getClass().getResource("my.tar").getFile());
File destDir = Files.createTempDirectory("UnpackTarTest_").toFile();
destDir.deleteOnExit();
final TarUnArchiver ua = new TarUnArchiver();
ua.setSourceFile(srcFile);
ua.enableLogging(new ConsoleLogger(Logger.LEVEL_DEBUG, "console_logger"));
ua.setDestDirectory(destDir);
ua.extract();
assertThat(destDir.list(), arrayContaining("mytar"));
}
}
【讨论】: