以下问题:
我有一个tarGz存档,其中充满了大约1 000 000个protoBuffer文件,我必须对其进行解压缩和处理。
目前,我发现的斋戒方式是用apache.commons中的TarArchiveInputStream解压缩。
目前,解压缩的部分是我的瓶颈,因为解压缩大约需要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方法允许您指定缓冲区大小。根据文件大小,您可能会从读取更大的块中获益。