You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Gary D. Gregory (Jira)" <ji...@apache.org> on 2024/08/15 13:39:00 UTC
[jira] [Comment Edited] (COMPRESS-686) Compression into BZip2 format has unexpected end of file when using a BufferedOutputStream
[ https://issues.apache.org/jira/browse/COMPRESS-686?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17873959#comment-17873959 ]
Gary D. Gregory edited comment on COMPRESS-686 at 8/15/24 1:38 PM:
-------------------------------------------------------------------
Hello [~richard.blank]
This is now fixed in git master and snapshot builds in [https://repository.apache.org/content/repositories/snapshots/]
Please verify and close this ticket if your use case succeeds.
TY!
was (Author: garydgregory):
Hello [~richard.blank]
This is now fixed in git master and snapshot builds in [https://repository.apache.org/content/repositories/snapshots/]
Please verify and close this ticket if your use case succeeds.
> Compression into BZip2 format has unexpected end of file when using a BufferedOutputStream
> ------------------------------------------------------------------------------------------
>
> Key: COMPRESS-686
> URL: https://issues.apache.org/jira/browse/COMPRESS-686
> Project: Commons Compress
> Issue Type: Bug
> Components: Compressors
> Affects Versions: 1.27.0
> Reporter: Richard Blank
> Assignee: Gary D. Gregory
> Priority: Major
> Fix For: 1.27.1
>
>
> h3. Problem
> When a file gets compressed into BZip2 format using class *BZip2CompressorOutputStream* then the format of the file is not valid.
> This can be proven trying to decompress the compressed file as it will fail with an error. For example using the _bzip2_ tool raises "bzip2: Compressed file ends unexpectedly;" while this _library_ returns error message "IO Stream is not in the BZip2 format".
> For larger files one can see the last part (block?) of the file doesn't get written to the compressed output. Small files remain empty.
> h3. Reproduction
> The error can be reproduced by running the following Java test on version 1.27.0. This test does not fail against older versions (e.g. 1.26.2).
> {noformat}
> java.io.IOException: Stream is not in the BZip2 format
> at org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream.init(BZip2CompressorInputStream.java:545)
> at org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream.<init>(BZip2CompressorInputStream.java:282)
> at org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream.<init>(BZip2CompressorInputStream.java:266)
> at net.ripe.rirstats.service.ArchiveServiceTest.decompressBzip2File(ArchiveServiceTest.java:56)
> at net.ripe.rirstats.service.ArchiveServiceTest.shouldCompressAndDecompressCorrectly(ArchiveServiceTest.java:30)
> {noformat}
> {noformat}
> import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
> import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
> import org.junit.jupiter.api.Test;
> import java.io.BufferedOutputStream;
> import java.io.FileInputStream;
> import java.io.FileOutputStream;
> import java.io.IOException;
> import java.io.InputStream;
> import java.io.OutputStream;
> import java.nio.file.Files;
> import java.nio.file.Path;
> import java.nio.file.Paths;
> import java.nio.file.StandardOpenOption;
> import static org.junit.jupiter.api.Assertions.assertEquals;
> class ArchiveServiceTest {
> @Test
> void shouldCompressAndDecompressCorrectly() throws Exception {
> Path tmpDir = Files.createTempDirectory("compressionTest");
> Path file = Path.of(tmpDir.toString(), "test.txt");
> var contents = "random contents";
> Files.writeString(file, contents, StandardOpenOption.CREATE);
> Path compressedFile = compressFile(file);
> Path decompressedFile = decompressBzip2File(compressedFile);
> String actual = Files.readString(decompressedFile);
> assertEquals(contents, actual);
> }
> private static Path compressFile(Path file) throws IOException {
> Path newFile = Paths.get(file.getParent().toString(), file.getFileName().toString() + ".bz2");
> try (InputStream in = Files.newInputStream(file);
> BZip2CompressorOutputStream bzOut = new BZip2CompressorOutputStream(
> new BufferedOutputStream(
> Files.newOutputStream(newFile)))) {
> final byte[] buffer = new byte[4096];
> int n;
> while ((n = in.read(buffer)) != -1) {
> bzOut.write(buffer, 0, n);
> }
> }
> return newFile;
> }
> private static Path decompressBzip2File(Path file) throws IOException {
> Path decompressedFile = Paths.get(file.getParent().toString(), file.getFileName().toString() + ".decompressed");
> try (InputStream fileInputStream = new FileInputStream(file.toFile());
> BZip2CompressorInputStream bzIn = new BZip2CompressorInputStream(fileInputStream);
> OutputStream fileOutputStream = new FileOutputStream(decompressedFile.toFile())) {
> final byte[] buffer = new byte[4096];
> int n;
> while ((n = bzIn.read(buffer)) != -1) {
> fileOutputStream.write(buffer, 0, n);
> }
> }
> return decompressedFile;
> }
> }
> {noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)