gpt4 book ai didi

java - 使用 Commons Compress 将目录压缩为 tar.gz

转载 作者:搜寻专家 更新时间:2023-10-30 21:15:32 24 4
gpt4 key购买 nike

我在使用公共(public)压缩库创建目录的 tar.gz 时遇到问题。我有一个目录结构如下。

parent/
child/
file1.raw
fileN.raw

我正在使用以下代码进行压缩。它运行良好,无一异常(exception)。但是,当我尝试解压缩那个 tar.gz 时,我得到一个名为“childDirToCompress”的文件。它的大小正确,因此文件在压缩过程中显然已相互附加。所需的输出将是一个目录。我不知道我做错了什么。任何明智的公共(public)压缩器都能让我走上正确的道路吗?

CreateTarGZ() throws CompressorException, FileNotFoundException, ArchiveException, IOException {
File f = new File("parent");
File f2 = new File("parent/childDirToCompress");

File outFile = new File(f2.getAbsolutePath() + ".tar.gz");
if(!outFile.exists()){
outFile.createNewFile();
}
FileOutputStream fos = new FileOutputStream(outFile);

TarArchiveOutputStream taos = new TarArchiveOutputStream(new GZIPOutputStream(new BufferedOutputStream(fos)));
taos.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_STAR);
taos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
addFilesToCompression(taos, f2, ".");
taos.close();

}

private static void addFilesToCompression(TarArchiveOutputStream taos, File file, String dir) throws IOException{
taos.putArchiveEntry(new TarArchiveEntry(file, dir));

if (file.isFile()) {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
IOUtils.copy(bis, taos);
taos.closeArchiveEntry();
bis.close();
}

else if(file.isDirectory()) {
taos.closeArchiveEntry();
for (File childFile : file.listFiles()) {
addFilesToCompression(taos, childFile, file.getName());

}
}
}

最佳答案

我遵循了这个解决方案,它一直有效,直到我处理了一个更大的文件集,它在处理 15000 - 16000 个文件后随机崩溃。以下行是泄漏文件处理程序:

IOUtils.copy(new FileInputStream(f), tOut);

并且代码因操作系统级别的“打开的文件过多”错误而崩溃以下小改动解决了这个问题:

FileInputStream in = new FileInputStream(f);
IOUtils.copy(in, tOut);
in.close();

关于java - 使用 Commons Compress 将目录压缩为 tar.gz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13461393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com