java - 快速 targz unArchiver

标签 java gzip tar

以下问题:

我有一个 tarGz 存档,其中包含大约 1 000 000 个 protoBuffer 文件,我必须解压和处理这些文件。 目前我发现的快速方法是用 TarArchiveInputStream 解压它。来自 apache.commons。 拆包部分是我目前的瓶颈,因为拆包大约需要20分钟。

这可以更快地完成吗? 他们是一种用多个线程解压 targz 文件的方法吗?我真的不知道这是否可行?

感谢任何帮助。

我的解压函数:

public void untar(String tarPath) throws IOException {
        try(TarArchiveInputStream fin = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(tarPath)))){
            UnzipperThreadHandler.setFinished(false);

            TarArchiveEntry entry;
            File out = new File((new File(tarPath).getParent())+"/help");

            while ((entry = fin.getNextTarEntry()) != null) {
                if (entry.isDirectory()) {
                    continue;
                }
                File curfile = new File(out, entry.getName());
                File parent = curfile.getParentFile();
                if (!parent.exists()) {
                    parent.mkdirs();
                }
                FileOutputStream fos = new FileOutputStream(curfile);
                IOUtils.copy(fin, fos);
                fos.close();
            }

            UnzipperThreadHandler.setFinished(true);
        }
    }

最佳答案

我认为您的问题不在于 TarArchiveInputStream,而在于完全无缓冲的 FileOutputStream。您应该用 BufferedOutputStream 包装它。

此外,IOUtils.copyLarge 方法允许您指定缓冲区大小。根据文件大小,您可能会从读取较大的 block 中受益。

关于java - 快速 targz unArchiver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57975792/

相关文章:

java - 我的 maven webapp 项目在 tomcat7 上成功启动但 tomcat8 失败,为什么?

java - Thymeleaf "foreach"无根元素

ruby-on-rails - 如何在 Mongrel/WEBrick 服务器上对从我的 Ruby on rails 输出的所有内容启用输出压缩 (gzip)?

c++ - 使用 zlib 的 gzip 文件访问功能的未压缩文件大小

c - 在 C 中打开 .tgz 文件

java - 如何使用 Java 将 .tar 文件放入 .tar.gz 文件中?

java - Camel 测试 - java.lang.IllegalArgumentException : defaultEndpoint must be specified

哈希表和可比较对象中使用的 Java Null 对象

json - 缩短 JSON : does it make sense? 中的属性名称

ubuntu - 在 ubuntu 16.04 服务器中安装 tomcat8 时提取 apache-tomcat-8.5.5.tar.gz 文件的问题