From 6d9925ba364c89f1f01ed5043b5bc3dc63ed3941 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 14 Apr 2015 15:43:50 +0900 Subject: [PATCH] Fixes for #100 --- .../org/xerial/snappy/SnappyOutputStream.java | 28 ++++++++----------- .../xerial/snappy/SnappyOutputStreamTest.java | 2 +- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/xerial/snappy/SnappyOutputStream.java b/src/main/java/org/xerial/snappy/SnappyOutputStream.java index 56c073a6..c930a4b3 100755 --- a/src/main/java/org/xerial/snappy/SnappyOutputStream.java +++ b/src/main/java/org/xerial/snappy/SnappyOutputStream.java @@ -231,25 +231,19 @@ private boolean hasSufficientOutputBufferFor(int inputSize) { * @throws IOException */ public void rawWrite(Object array, int byteOffset, int byteLength) throws IOException { - - if(inputCursor + byteLength < blockSize) { + int cursor = 0; + while(cursor < byteLength) { + int readLen = Math.min(byteLength - cursor, blockSize - inputCursor); // copy the input data to uncompressed buffer - Snappy.arrayCopy(array, byteOffset, byteLength, inputBuffer, inputCursor); - inputCursor += byteLength; - return; - } - - compressInput(); - - for(int readBytes = 0; readBytes < byteLength; ) { - int inputLen = Math.min(blockSize, byteLength - readBytes); - if(!hasSufficientOutputBufferFor(inputLen)) { - dumpOutput(); + if(readLen > 0) { + Snappy.arrayCopy(array, byteOffset + cursor, readLen, inputBuffer, inputCursor); + inputCursor += readLen; } - int compressedSize = Snappy.rawCompress(array, byteOffset + readBytes, inputLen, outputBuffer, outputCursor + 4); - writeInt(outputBuffer, outputCursor, compressedSize); - outputCursor += 4 + compressedSize; - readBytes += inputLen; + if(inputCursor < blockSize) + return; + + compressInput(); + cursor += readLen; } } diff --git a/src/test/java/org/xerial/snappy/SnappyOutputStreamTest.java b/src/test/java/org/xerial/snappy/SnappyOutputStreamTest.java index 5b5f0e13..10850a80 100755 --- a/src/test/java/org/xerial/snappy/SnappyOutputStreamTest.java +++ b/src/test/java/org/xerial/snappy/SnappyOutputStreamTest.java @@ -152,7 +152,7 @@ public void batchingOfWritesShouldNotAffectCompressedDataSize() throws Exception int[] chunkSizes = new int[] { 1, 100, 1023, 1024, 10000}; for (int chunkSize : chunkSizes) { byte[] compressedData = compressAsChunks(orig, chunkSize); - assertEquals(expectedCompressedData.length, compressedData.length); + assertEquals(String.format("when chunk size = %,d", chunkSize), expectedCompressedData.length, compressedData.length); assertArrayEquals(expectedCompressedData, compressedData); } }