我正在使用以下代码将 byte[] 写入历史记录队列,
excerptAppender.writeBytes(b -> b.write(data));
如何从队列中读回相同的字节[]。我发现了这样的东西,
excerptTailer.readBytes(b-> b.read(bytes));
但在这种情况下我需要长度。我是否需要单独写入长度并读取相同的长度来创建字节[]。?
或者有没有一种方法可以让框架本身处理长度,这样我们就可以读取,
excerptTailer.readBytes();
我找不到太多关于此的文档。
从 github 获取此示例,
assertTrue(tailer.readBytes(b -> {
long address = b.address(b.readPosition());
Unsafe unsafe = UnsafeMemory.UNSAFE;
int code = unsafe.getByte(address);
address++;
int num = unsafe.getInt(address);
address += 4;
long num2 = unsafe.getLong(address);
address += 8;
int length = unsafe.getByte(address);
address++;
byte[] bytes = new byte[length];
unsafe.copyMemory(null, address, bytes, Unsafe.ARRAY_BYTE_BASE_OFFSET, bytes.length);
String text = new String(bytes, StandardCharsets.UTF_8);
assertEquals("Hello World", text);
// do something with values
}));
这是否建议用于生产?
最佳答案
很抱歉回复这么旧的帖子,认为有人可以从中受益。
您可以定义大约一次的缓冲区大小(相当大),框架提供实际的数据长度。看看下面对我有用的代码
private byte[] readData() {
SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary("./temp/").build();
ExcerptTailer tailer = queue.createTailer("my-single-tailer");
byte[] data = null;
Bytes<ByteBuffer> bytes = Bytes.elasticHeapByteBuffer(1024 * 128);
boolean read = tailer.readBytes(bytes);
if (read) {
byte[] readData = bytes.underlyingObject().array();
int len = (int) bytes.readRemaining();
bytes.clear();
data = Arrays.copyOf(readData, len);
}
return data;
}
示例写入数据代码是
private void writeData(byte[] data) {
SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary("./temp/").rollCycle(RollCycles.HOURLY).build();
ExcerptAppender appender = queue.acquireAppender();
Bytes<ByteBuffer> bytes = Bytes.elasticByteBuffer(1024 * 128);
bytes.ensureCapacity(data.length);
ByteBuffer byteBuffer = bytes.underlyingObject();
byteBuffer.put(data);
bytes.readPositionRemaining(0, byteBuffer.position());
appender.writeBytes(bytes);
byteBuffer.clear();
}
关于java - 从历史队列中读取 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44780240/