重新使用Chronicle Bytes'的OutputStream

时间:2016-12-22 14:30:25

标签: chronicle chronicle-bytes

我正在使用一个采用OutputStream的第三方二进制编码器。我从Marshallable的writeMarshallable方法中检索OutputStream,类似于:

public void writeMarshallable(WireOut wire) {
    OutputStream outputStream = wire.bytes().outputStream();
    // third party code gets the outputStream, etc.
}

wire.bytes()。outputStream()的实现在每次调用时创建一个新的StreamingOutputStream,这是我希望避免的(多余的对象分配时)底层字节实际上没有改变)。

那就是说,我正在考虑将WeakReference存储到给定的wire.bytes()值并检查提供的值引用(即==)是否与先前提供的值相同:

private WeakReference<Bytes<?>> priorBytesRef = new WeakReference<>(null);

public void writeMarshallable(WireOut wire) {
    Bytes<?> bytes = wire.bytes();
    if (bytes != priorBytesRef.get()) {
        priorBytesRef = new WeakReference<>(bytes);
        thirdPartyEncoder = EncoderFactoryExample.from(bytes.outputStream());
    }
    // utilize thirdPartyEncoder, etc.
}

所以我的问题是这是否是一种合理的方法,或者如果你们Chronicle的人有更合理的方式?

谢谢!

1 个答案:

答案 0 :(得分:0)

我建议使用ThreadLocal保存StreamingOutputStream

static final ThreadLocal<StreamingOutputStream> bosTL = ThreadLocal.withInitial(StreamingOutputStream::new);

public void writeMarshallable(WireOut wire) {
    OutputStream out = bosTL.get().init(wire.bytes());
    // utilize thirdPartyEncoder, etc.
}