This commit is contained in:
100
src/org/redkale/util/ByteBufferWriter.java
Normal file
100
src/org/redkale/util/ByteBufferWriter.java
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.redkale.util;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 以ByteBuffer为数据载体的Writer
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* 详情见: https://redkale.org
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
*/
|
||||||
|
public class ByteBufferWriter {
|
||||||
|
|
||||||
|
private final Supplier<ByteBuffer> supplier;
|
||||||
|
|
||||||
|
private ByteBuffer[] buffers;
|
||||||
|
|
||||||
|
protected ByteBufferWriter(Supplier<ByteBuffer> supplier) {
|
||||||
|
this.supplier = supplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ByteBufferWriter create(Supplier<ByteBuffer> supplier) {
|
||||||
|
return new ByteBufferWriter(supplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ByteBuffer getLastBuffer(int size) {
|
||||||
|
if (this.buffers == null) {
|
||||||
|
ByteBuffer buf = supplier.get();
|
||||||
|
this.buffers = Utility.append(this.buffers, buf);
|
||||||
|
return buf;
|
||||||
|
} else if (this.buffers[this.buffers.length - 1].remaining() < size) {
|
||||||
|
ByteBuffer buf = supplier.get();
|
||||||
|
this.buffers = Utility.append(this.buffers, buf);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
return this.buffers[this.buffers.length - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteBuffer[] toBuffers() {
|
||||||
|
if (buffers == null) return new ByteBuffer[0];
|
||||||
|
for (ByteBuffer buf : this.buffers) {
|
||||||
|
if (buf.position() != 0) buf.flip();
|
||||||
|
}
|
||||||
|
return this.buffers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteBufferWriter put(byte b) {
|
||||||
|
getLastBuffer(1).put(b);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteBufferWriter put(short value) {
|
||||||
|
getLastBuffer(2).putShort(value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteBufferWriter putInt(int value) {
|
||||||
|
getLastBuffer(4).putInt(value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteBufferWriter putFloat(float value) {
|
||||||
|
getLastBuffer(4).putFloat(value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteBufferWriter putLong(long value) {
|
||||||
|
getLastBuffer(8).putLong(value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteBufferWriter putDouble(double value) {
|
||||||
|
getLastBuffer(8).putDouble(value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteBufferWriter put(byte[] src) {
|
||||||
|
return put(src, 0, src.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteBufferWriter put(byte[] src, int offset, int length) {
|
||||||
|
ByteBuffer buf = getLastBuffer(1);
|
||||||
|
int remain = buf.remaining();
|
||||||
|
if (remain >= length) {
|
||||||
|
buf.put(src, offset, length);
|
||||||
|
} else {
|
||||||
|
buf.put(src, offset, remain);
|
||||||
|
put(src, offset + remain, length - remain);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user