2

我有一个需要 tar/gz 大量数据(14 gigs)的 java 程序,我正在使用 commons-compress。这将是每周重复发生的工作,并且是自动化的。

当我尝试压缩这种大小的东西时,我得到:

java.lang.IllegalArgumentException: 13313903445=143144405525 will not fit in octal number buffer of length 11
    at org.apache.commons.compress.archivers.tar.TarUtils.formatUnsignedOctalString(TarUtils.java:212)
    at org.apache.commons.compress.archivers.tar.TarUtils.formatLongOctalBytes(TarUtils.java:265)
    at org.apache.commons.compress.archivers.tar.TarArchiveEntry.writeEntryHeader(TarArchiveEntry.java:749)
    at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.putArchiveEntry(TarArchiveOutputStream.java:209)
    at com.broadridge.adc.core.commons.io.ADCFileUtils.addFilesToCompression(ADCFileUtils.java:144)
    at com.broadridge.adc.core.commons.io.ADCFileUtils.addFilesToCompression(ADCFileUtils.java:154)
    at com.broadridge.adc.core.commons.io.ADCFileUtils.compressFiles(ADCFileUtils.java:125)
    at com.broadridge.adc.core.commons.io.ADCFileUtils.compressFile(ADCFileUtils.java:106)

我的代码适用于少量信息(大约 600 兆)。我查看了源代码,但我不清楚为什么会发生错误。

有谁知道为什么会这样?

4

1 回答 1

3

您超出了TarConstants.SIZELEN定义的某个限制,即 12。

Javadoc 告诉我们的是:

标头缓冲区中大小字段的长度。包括尾随空格或 NUL。

它由堆栈跟踪中的TarArchiveEntry.writeEntryHeader(byte[] outbuf)使用。稍后在堆栈中,此限制被减去 1,导致限制为 11,这是您的异常消息的一部分。

稍后在调用堆栈中TarUtils.formatUnsignedOctalString(final long value, byte[] buffer, final int offset, final int length)在超过 11 的限制处被调用。

因此,您似乎超出了某些最大标头字段大小。

于 2012-04-13T12:29:12.900 回答