diff --git a/spring-core/src/main/java/org/springframework/core/io/buffer/DataBuffer.java b/spring-core/src/main/java/org/springframework/core/io/buffer/DataBuffer.java index baf161047b..6f98d016a8 100644 --- a/spring-core/src/main/java/org/springframework/core/io/buffer/DataBuffer.java +++ b/spring-core/src/main/java/org/springframework/core/io/buffer/DataBuffer.java @@ -264,13 +264,13 @@ public interface DataBuffer { break; } if (cr.isOverflow()) { - writePosition(outBuffer.position()); + writePosition(writePosition() + outBuffer.position()); int maximumSize = (int) (inBuffer.remaining() * charsetEncoder.maxBytesPerChar()); ensureCapacity(maximumSize); outBuffer = asByteBuffer(writePosition(), writableByteCount()); } } - writePosition(outBuffer.position()); + writePosition(writePosition() + outBuffer.position()); } return this; } diff --git a/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java b/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java index 2b78b16df9..054b60f14c 100644 --- a/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java +++ b/spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java @@ -225,6 +225,27 @@ public class DataBufferTests extends AbstractDataBufferAllocatingTestCase { release(buffer); } + @Test + public void writeMultipleUtf8String() { + + DataBuffer buffer = createDataBuffer(1); + buffer.write("abc", StandardCharsets.UTF_8); + assertEquals(3, buffer.readableByteCount()); + + buffer.write("def", StandardCharsets.UTF_8); + assertEquals(6, buffer.readableByteCount()); + + buffer.write("ghi", StandardCharsets.UTF_8); + assertEquals(9, buffer.readableByteCount()); + + byte[] result = new byte[9]; + buffer.read(result); + + assertArrayEquals("abcdefghi".getBytes(), result); + + release(buffer); + } + @Test public void inputStream() throws IOException { DataBuffer buffer = createDataBuffer(4);