以下问题:
我有一个 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/