2012-04-13 5 views
1

Ich habe ein Java-Programm, das Tear/GZ ein großes bisschen Daten (14 Gigs) und ich Commons-compress verwenden muss. Dies wird jede Woche ein neuer Job sein und ist automatisiert.commons-compress "wird nicht in oktal passen"

Wenn ich versuche, etwas von dieser Größe zu komprimieren, die ich erhalten:

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) 

Mein Code funktioniert für kleinere Mengen von Informationen (etwa 600 MB) in Ordnung. Ich habe mir den Quellcode angesehen, aber es ist nicht sauber für mich, warum der Fehler auftritt.

Hat jemand eine Idee, warum das passiert?

+0

Es könnte sein, dass die von commons-compress verwendete tar-Version der alte Stil ist, der eine 8-Gig-Grenze hat. – user965697

Antwort

2

Sie eine Grenze überschreitet durch TarConstants.SIZELEN definiert, die 12

ist, was Javadoc uns darüber erzählt:

Die Länge des Größenfeld in einem Kopfpuffer. Enthält den nachgestellten Speicherplatz oder NUL.

Es wird von TarArchiveEntry.writeEntryHeader(byte[] outbuf) verwendet, die in Ihrem Stacktrace ist. Später im Stapel wird dieses Limit um 1 subtrahiert, was zu einem Limit von 11 führt, das Teil Ihrer Ausnahmebedingungsnachricht ist.

Später im Call-Stack wird TarUtils.formatUnsignedOctalString(final long value, byte[] buffer, final int offset, final int length) aufgerufen wo der Grenzwert von 11 überschritten wird.

Sie scheinen also einige maximale Header Feldgröße zu überschreiten.

+1

Die tatsächlich programmatische Lösung ist, die in dem BigNumberMode TarArchiveOutputStream (in Common-compress 1.4 oder>) Code einzustellen: TarArchiveOutputStream taos = new TarArchiveOutputStream ( \t \t \t neuen GZIPOutputStream (new BufferedOutputStream (FOS))); \t \t taos.setBigNumberMode (TarArchiveOutputStream.BIGNUMBER_STAR); \t \t taos.setLongFileMode (TarArchiveOutputStream.LONGFILE_GNU); – user965697

+0

Wenn Sie eine Lösung gefunden haben, bei der Sie nicht auf diese Art von Problem stoßen, dann geben Sie als Antwort auf Ihre eigene Frage. Ich gehe nicht verärgert, wenn du deine eigene Antwort akzeptierst. Meine Antwort zeigt nur auf das Problem, Ihre Antwort bietet eine Lösung, die viel wertvoller ist. –