Java 正在从历史记录队列读取字节[]

Java 正在从历史记录队列读取字节[],java,chronicle-queue,Java,Chronicle Queue,我正在使用以下代码将字节[]写入历史记录队列 excerptAppender.writeBytes(b -> b.write(data)); 如何从队列中读回相同的字节[]。我发现了这样的东西 excerptTailer.readBytes(b-> b.read(bytes)); 但在这种情况下,我需要长度。创建字节[]时是否需要分别写入长度和读取长度 或者有没有一种方法可以让框架本身来处理长度,这样我们就可以像 excerptTailer.readBytes(); 我找不到太

我正在使用以下代码将字节[]写入历史记录队列

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 byte[]readData(){
SingleChronicleQueue=SingleChronicleQueueBuilder.binary(“./temp/”).build();
extracptailer-tailer=queue.createTailer(“我的单条尾巴”);
字节[]数据=null;
字节=字节。elasticHeapByteBuffer(1024*128);
布尔读取=tailer.readBytes(字节);
如果(读){
byte[]readData=bytes.underyingobject().array();
int len=(int)字节数。readRemaining();
clear();
data=Arrays.copyOf(readData,len);
}
返回数据;
}
此外,还可以使用示例写入数据代码

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();
  }
private void writeData(字节[]数据){
SingleChronicleQueue=SingleChronicleQueueBuilder.binary(“./temp/”).rollCycle(RollCycles.HOURLY.build();
摘录appender appender=queue.acquireAppender();
字节=字节。弹性字节缓冲(1024*128);
字节数。数据容量(data.length);
ByteBuffer ByteBuffer=字节。underlyingObject();
byteBuffer.put(数据);
字节数.readPositionRemaining(0,byteBuffer.position());
appender.writeBytes(字节);
byteBuffer.clear();
}

很抱歉回复了这么旧的帖子,以为有人可以从中获益

您可以定义大约一倍的缓冲区大小(相当大),框架提供实际的数据长度。看看下面的代码,这对我来说是有效的

  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 byte[]readData(){
SingleChronicleQueue=SingleChronicleQueueBuilder.binary(“./temp/”).build();
extracptailer-tailer=queue.createTailer(“我的单条尾巴”);
字节[]数据=null;
字节=字节。elasticHeapByteBuffer(1024*128);
布尔读取=tailer.readBytes(字节);
如果(读){
byte[]readData=bytes.underyingobject().array();
int len=(int)字节数。readRemaining();
clear();
data=Arrays.copyOf(readData,len);
}
返回数据;
}
此外,还可以使用示例写入数据代码

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();
  }
private void writeData(字节[]数据){
SingleChronicleQueue=SingleChronicleQueueBuilder.binary(“./temp/”).rollCycle(RollCycles.HOURLY.build();
摘录appender appender=queue.acquireAppender();
字节=字节。弹性字节缓冲(1024*128);
字节数。数据容量(data.length);
ByteBuffer ByteBuffer=字节。underlyingObject();
byteBuffer.put(数据);
字节数.readPositionRemaining(0,byteBuffer.position());
appender.writeBytes(字节);
byteBuffer.clear();
}