我正在使用 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/