java - 如何使用 Apache Commons Compress 将更改文件附加到 Tar 存档

标签 java file compression

我正在使用 Apache Commons Compress 创建一个 tar 存档,但一直遇到以下异常:

java.io.IOException: request to write '571' bytes exceeds size in header of '45536102' bytes for entry 'logfile.log' at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.write(TarArchiveOutputStream.java:377) ~[commons-compress-1.9.jar:1.9]

问题是在下面的代码中,文件大小实际上从我添加 tar 归档条目到它全部读入 tar 输出流时发生了变化:

TarArchiveEntry entry = new TarArchiveEntry(fileToArchive);
tarOutputStream.putArchiveEntry(entry);
IOUtils.copy(new FileInputStream(fileToArchive), tarOutputStream);

如果在我将文件写入 tarOutputStream 时文件正在被修改(它是一个日志文件),我如何将文件写入 tar 存档?我应该将整个文件读入内存然后写入吗?或者只读到 tar 存档条目允许的大小?那些似乎都冒着数据损坏的风险。我能想到的唯一其他选择是将文件复制到本地文件系统,这样它就不会被修改,然后压缩该副本,但这看起来很笨拙。

最佳答案

在 tar 存档中,元数据(包括大小)位于实际内容之前。使用不可搜索的流时,无法在知道大小后倒带和替换它。

Apache Commons Compress 仅支持 tar 的纯流式传输模式,因此只有当条目的内容大小与写入元数据时的大小相同时,才可以添加条目。

您应该研究在归档之前轮换日志的方法。

关于java - 如何使用 Apache Commons Compress 将更改文件附加到 Tar 存档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32358654/

相关文章:

java - 运算符|对于整数值

file - HTTP/2和文件下载

c++ - 从 Cpp 中的 URL 下载时获取空的 CSV

ubuntu - zip 存档中是否可以使用硬链接(hard link)?

C# 在将字符串转换为 byte[] 并将 byte[] 转换为字符串时出现内存不足异常

MySQL innodb COMPRESSED中KEY_BLOCK_SIZE取值注意事项

java - 评分系统和数组

java - Jmeter 2.11 : Getting Peer Not Authenticated

java - 无法在 Tomcat 上运行 webapp,错误 51,尽管 java -version 是正确的,Mac OS X

c# - 如何从 PC 中查找/打开文件