提交 4c90f914 编写于 作者: Y YunaiV

美滋滋

标记这个类,看完了
上级 af54fe3d
......@@ -22,28 +22,43 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
/**
* 基于 ByteBuffer 的 ChannelBuffer 实现类
*/
public class ByteBufferBackedChannelBuffer extends AbstractChannelBuffer {
/**
* buffer
* java.nio.ByteBuffer
*/
private final ByteBuffer buffer;
/**
* 容量
*/
private final int capacity;
public ByteBufferBackedChannelBuffer(ByteBuffer buffer) {
if (buffer == null) {
throw new NullPointerException("buffer");
}
// buffer
this.buffer = buffer.slice();
// 容量
capacity = buffer.remaining();
// 设置 `writerIndex`
writerIndex(capacity);
}
public ByteBufferBackedChannelBuffer(ByteBufferBackedChannelBuffer buffer) {
// buffer
this.buffer = buffer.buffer;
// 容量
capacity = buffer.capacity;
// 设置 `writerIndex` `readerIndex`
setIndex(buffer.readerIndex(), buffer.writerIndex());
}
@Override
public ChannelBufferFactory factory() {
if (buffer.isDirect()) {
return DirectChannelBufferFactory.getInstance();
......@@ -52,12 +67,12 @@ public class ByteBufferBackedChannelBuffer extends AbstractChannelBuffer {
}
}
@Override
public int capacity() {
return capacity;
}
@Override
public ChannelBuffer copy(int index, int length) {
ByteBuffer src;
try {
......@@ -74,12 +89,12 @@ public class ByteBufferBackedChannelBuffer extends AbstractChannelBuffer {
return new ByteBufferBackedChannelBuffer(dst);
}
@Override
public byte getByte(int index) {
return buffer.get(index);
}
@Override
public void getBytes(int index, byte[] dst, int dstIndex, int length) {
ByteBuffer data = buffer.duplicate();
try {
......@@ -90,7 +105,7 @@ public class ByteBufferBackedChannelBuffer extends AbstractChannelBuffer {
data.get(dst, dstIndex, length);
}
@Override
public void getBytes(int index, ByteBuffer dst) {
ByteBuffer data = buffer.duplicate();
int bytesToCopy = Math.min(capacity() - index, dst.remaining());
......@@ -102,7 +117,7 @@ public class ByteBufferBackedChannelBuffer extends AbstractChannelBuffer {
dst.put(data);
}
@Override
public void getBytes(int index, ChannelBuffer dst, int dstIndex, int length) {
if (dst instanceof ByteBufferBackedChannelBuffer) {
ByteBufferBackedChannelBuffer bbdst = (ByteBufferBackedChannelBuffer) dst;
......@@ -118,6 +133,7 @@ public class ByteBufferBackedChannelBuffer extends AbstractChannelBuffer {
}
@Override
public void getBytes(int index, OutputStream out, int length) throws IOException {
if (length == 0) {
return;
......@@ -135,31 +151,31 @@ public class ByteBufferBackedChannelBuffer extends AbstractChannelBuffer {
}
}
@Override
public boolean isDirect() {
return buffer.isDirect();
}
@Override
public void setByte(int index, int value) {
buffer.put(index, (byte) value);
}
@Override
public void setBytes(int index, byte[] src, int srcIndex, int length) {
ByteBuffer data = buffer.duplicate();
data.limit(index + length).position(index);
data.put(src, srcIndex, length);
}
@Override
public void setBytes(int index, ByteBuffer src) {
ByteBuffer data = buffer.duplicate();
data.limit(index + src.remaining()).position(index);
data.put(src);
}
@Override
public void setBytes(int index, ChannelBuffer src, int srcIndex, int length) {
if (src instanceof ByteBufferBackedChannelBuffer) {
ByteBufferBackedChannelBuffer bbsrc = (ByteBufferBackedChannelBuffer) src;
......@@ -174,7 +190,7 @@ public class ByteBufferBackedChannelBuffer extends AbstractChannelBuffer {
}
}
@Override
public ByteBuffer toByteBuffer(int index, int length) {
if (index == 0 && length == capacity()) {
return buffer.duplicate();
......@@ -184,7 +200,7 @@ public class ByteBufferBackedChannelBuffer extends AbstractChannelBuffer {
}
}
@Override
public int setBytes(int index, InputStream in, int length) throws IOException {
int readBytes = 0;
......@@ -224,18 +240,19 @@ public class ByteBufferBackedChannelBuffer extends AbstractChannelBuffer {
return readBytes;
}
@Override
public byte[] array() {
return buffer.array();
}
@Override
public boolean hasArray() {
return buffer.hasArray();
}
@Override
public int arrayOffset() {
return buffer.arrayOffset();
}
}
......@@ -25,10 +25,14 @@ import java.nio.channels.ClosedChannelException;
import java.nio.channels.GatheringByteChannel;
import java.nio.channels.ScatteringByteChannel;
/**
* 基于字节数组的 Buffer 实现类
*/
public class HeapChannelBuffer extends AbstractChannelBuffer {
/**
* The underlying heap byte array that this buffer is wrapping.
* 字节数组
*/
protected final byte[] array;
......@@ -65,30 +69,42 @@ public class HeapChannelBuffer extends AbstractChannelBuffer {
setIndex(readerIndex, writerIndex);
}
@Override
public ChannelBufferFactory factory() {
return HeapChannelBufferFactory.getInstance();
}
@Override
public boolean isDirect() {
return false;
}
@Override
public int capacity() {
return array.length;
}
@Override
public boolean hasArray() {
return true;
}
@Override
public byte[] array() {
return array;
}
@Override
public int arrayOffset() {
return 0;
}
@Override
public byte getByte(int index) {
return array[index];
}
@Override
public void getBytes(int index, ChannelBuffer dst, int dstIndex, int length) {
if (dst instanceof HeapChannelBuffer) {
getBytes(index, ((HeapChannelBuffer) dst).array, dstIndex, length);
......@@ -97,14 +113,17 @@ public class HeapChannelBuffer extends AbstractChannelBuffer {
}
}
@Override
public void getBytes(int index, byte[] dst, int dstIndex, int length) {
System.arraycopy(array, index, dst, dstIndex, length);
}
@Override
public void getBytes(int index, ByteBuffer dst) {
dst.put(array, index, Math.min(capacity() - index, dst.remaining()));
}
@Override
public void getBytes(int index, OutputStream out, int length)
throws IOException {
out.write(array, index, length);
......@@ -115,26 +134,31 @@ public class HeapChannelBuffer extends AbstractChannelBuffer {
return out.write(ByteBuffer.wrap(array, index, length));
}
@Override
public void setByte(int index, int value) {
array[index] = (byte) value;
}
@Override
public void setBytes(int index, ChannelBuffer src, int srcIndex, int length) {
if (src instanceof HeapChannelBuffer) {
if (src instanceof HeapChannelBuffer) { // 都是 HeapChannelBuffer ,可以直接 System#arraycopy(...)
setBytes(index, ((HeapChannelBuffer) src).array, srcIndex, length);
} else {
src.getBytes(srcIndex, array, index, length);
}
}
@Override
public void setBytes(int index, byte[] src, int srcIndex, int length) {
System.arraycopy(src, srcIndex, array, index, length);
}
@Override
public void setBytes(int index, ByteBuffer src) {
src.get(array, index, src.remaining());
}
@Override
public int setBytes(int index, InputStream in, int length) throws IOException {
int readBytes = 0;
do {
......@@ -180,6 +204,7 @@ public class HeapChannelBuffer extends AbstractChannelBuffer {
return readBytes;
}
@Override
public ChannelBuffer copy(int index, int length) {
if (index < 0 || length < 0 || index + length > array.length) {
throw new IndexOutOfBoundsException();
......@@ -190,10 +215,7 @@ public class HeapChannelBuffer extends AbstractChannelBuffer {
return new HeapChannelBuffer(copiedArray);
}
public ChannelBufferFactory factory() {
return HeapChannelBufferFactory.getInstance();
}
@Override
public ByteBuffer toByteBuffer(int index, int length) {
return ByteBuffer.wrap(array, index, length);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册