Add optimized DataBufferInputStream overrides

Add optimized DataBufferInputStream overrides for readNBytes, skip, and transferTo; all of them
allocate byte buffers which we can either avoid (in the case of skip) or size more precisely since
the number of remaining bytes is known.

Closes gh-34799

Signed-off-by: Patrick Strawderman <pstrawderman@netflix.com>
This commit is contained in:
Patrick Strawderman
2025-04-22 17:59:08 -05:00
committed by Brian Clozel
parent bbae625850
commit 182d654fa8
2 changed files with 80 additions and 1 deletions

View File

@@ -16,6 +16,7 @@
package org.springframework.core.io.buffer;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
@@ -342,6 +343,48 @@ class DataBufferTests extends AbstractDataBufferAllocatingTests {
assertThat(len).isEqualTo(3);
assertThat(bytes).containsExactly('c', 'd', 'e');
buffer.readPosition(0);
inputStream = buffer.asInputStream();
assertThat(inputStream.readAllBytes()).asString().isEqualTo("abcde");
assertThat(inputStream.available()).isEqualTo(0);
assertThat(inputStream.readAllBytes()).isEmpty();
buffer.readPosition(0);
inputStream = buffer.asInputStream();
inputStream.mark(5);
assertThat(inputStream.readNBytes(0)).isEmpty();
assertThat(inputStream.readNBytes(1000)).asString().isEqualTo("abcde");
inputStream.reset();
assertThat(inputStream.readNBytes(3)).asString().isEqualTo("abc");
assertThat(inputStream.readNBytes(2)).asString().isEqualTo("de");
assertThat(inputStream.readNBytes(10)).isEmpty();
buffer.readPosition(0);
inputStream = buffer.asInputStream();
inputStream.mark(5);
assertThat(inputStream.skip(1)).isEqualTo(1);
assertThat(inputStream.readAllBytes()).asString().isEqualTo("bcde");
assertThat(inputStream.skip(10)).isEqualTo(0);
assertThat(inputStream.available()).isEqualTo(0);
inputStream.reset();
assertThat(inputStream.skip(100)).isEqualTo(5);
assertThat(inputStream.available()).isEqualTo(0);
buffer.readPosition(0);
inputStream = buffer.asInputStream();
inputStream.mark(5);
ByteArrayOutputStream out = new ByteArrayOutputStream();
assertThat(inputStream.transferTo(out)).isEqualTo(5);
assertThat(out.toByteArray()).asString().isEqualTo("abcde");
assertThat(inputStream.available()).isEqualTo(0);
out.reset();
inputStream.reset();
assertThat(inputStream.read()).isEqualTo('a');
assertThat(inputStream.transferTo(out)).isEqualTo(4);
assertThat(out.toByteArray()).asString().isEqualTo("bcde");
assertThat(inputStream.available()).isEqualTo(0);
assertThat(inputStream.transferTo(OutputStream.nullOutputStream())).isEqualTo(0);
release(buffer);
}