我有一个java程序,需要tar / gz大量数据(14演出),我正在使用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兆)。我查看了源代码但是我发现错误的原因并不清楚。
有谁知道为什么会这样?
答案 0 :(得分:2)
你超过TarConstants.SIZELEN定义的一个限制,即12。
Javadoc告诉我们的是:
标头缓冲区中size字段的长度。包括尾随 空间或NUL。
它由堆栈跟踪中的TarArchiveEntry.writeEntryHeader(byte[] outbuf)使用。在堆栈的后面,这个限制被减去1,导致限制为11,这是你的异常消息的一部分。
稍后在调用堆栈中TarUtils.formatUnsignedOctalString(final long value, byte[] buffer, final int offset, final int length)被调用,其中超出了11的限制。
所以你似乎超过了一些最大标题字段大小。