由已分配的ByteString支持的高效okio源?

时间:2019-02-05 10:33:22

标签: java okhttp okio

使用OkHttp Websocket时,listener使用ByteString向应用程序提供二进制有效负载。 我想将这些字节输入需要okio.Source的某些代码中(在这种情况下为GzipSource),但是我找不到有效的方法。

我当前的解决方案如下:

        @Override
        public void onMessage(WebSocket webSocket, ByteString bytes) {
            Buffer gzipBuffer = new Buffer();
            gzipBuffer.write(bytes);

            GzipSource gzipSource = new GzipSource(gzipBuffer);
            ....
        }

Buffer.write的缺点是,它会产生额外的字节副本(在Buffer的情况下,则是分段的副本,即使将其合并也是如此)。在这种Websocket情况下,只是为ByteString本身分配了一个字节数组(当从WebSocketReader impl移交时)。

我的问题是:还有其他通过ByteStringSource进行读取的方式吗? 由于ByteString应该是不可变的,而Source只会保存一些读取位置信息,因此我认为它应该是完全可行的(但不能从外部代码获取,因为我无法访问{{ 1}})..感觉就像我在这里错过了一个明显的解决方案..:)

感谢任何提示或指针!

1 个答案:

答案 0 :(得分:0)

您编写它的方式几乎是最佳的。

Okio经过优化,可在转换层之间移动数据:压缩,成帧,线程化等。尽管在层之间移动数据非常快(无副本),但最初将数据输入系统需要付出前期成本。无论如何,通常这就是您需要执行的I / O:加载文件或发送数据包。但是在这种情况下,您必须复制以将字节放入第一个缓冲区。感觉效率低下,但好处是您的下一个Source.read()调用会很快,因此总体效果还是不错的。

相关问题