Browse Source

DefaultDataBuffer improvements

DefaultDataBuffer.grow(int):
- Copy only the remaining data
- Update readPosition/writePosition
pull/1210/head
Violeta Georgieva 9 years ago
parent
commit
882b075fdf
  1. 5
      spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBuffer.java
  2. 17
      spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java

5
spring-core/src/main/java/org/springframework/core/io/buffer/DefaultDataBuffer.java

@ -272,10 +272,13 @@ public class DefaultDataBuffer implements DataBuffer { @@ -272,10 +272,13 @@ public class DefaultDataBuffer implements DataBuffer {
ByteBuffer.allocate(minCapacity));
// Explicit cast for compatibility with covariant return type on JDK 9's ByteBuffer
((Buffer) oldBuffer).position(this.readPosition);
final int remaining = readableByteCount();
((Buffer) oldBuffer).position(this.readPosition).limit(this.writePosition);
newBuffer.put(oldBuffer);
this.byteBuffer = newBuffer;
this.readPosition = 0;
this.writePosition = remaining;
oldBuffer.clear();
}

17
spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java

@ -20,6 +20,7 @@ import java.io.IOException; @@ -20,6 +20,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import org.junit.Test;
@ -266,4 +267,20 @@ public class DataBufferTests extends AbstractDataBufferAllocatingTestCase { @@ -266,4 +267,20 @@ public class DataBufferTests extends AbstractDataBufferAllocatingTestCase {
}
@Test
public void growDataBuffer() {
DataBuffer buffer = stringBuffer("Hello World!");
byte[] bytes = new byte[5];
buffer.read(bytes);
assertArrayEquals("Hello".getBytes(StandardCharsets.UTF_8), bytes);
buffer.write("!!".getBytes(StandardCharsets.UTF_8));
bytes = new byte[9];
buffer.read(bytes);
assertArrayEquals(" World!!!".getBytes(StandardCharsets.UTF_8), bytes);
}
}
Loading…
Cancel
Save