java高效的okio源代码由已经分配的bytestring支持?

c0vxltue  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(424)

当使用okhttpwebsocket时,侦听器使用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 它会产生额外的字节拷贝(在缓冲区中,是分段拷贝,即使是池拷贝,也会产生额外的开销)。在这个websocket案例中,一个字节数组只是分配给bytestring本身(当从 WebSocketReader impl)。
我的问题是:有没有其他更喜欢的阅读方式 ByteString ,通过 Source ? 自从 ByteString 应该是不变的 Source 只需要保存一些读取的位置信息,我认为这应该是完全可行的(但不是从外部代码,因为我无法访问 byte[] ).. 所以我觉得我错过了一个明显的解决办法……)
谢谢你的提示和指点!

8nuwlpux

8nuwlpux1#

你写它的方式几乎是最佳的。
okio针对在转换层之间移动数据进行了优化:压缩、成帧、线程等。虽然在层之间移动数据非常快(没有副本),但最初将数据放入系统需要预先支付成本。不管怎样,这通常是您需要执行的i/o操作:加载文件或发送数据包。但在这种情况下,必须进行复制才能将字节放入第一个缓冲区。这感觉效率很低,但好的一面是你的下一个来源。read()调用会很快,所以整个过程仍然会很好。

相关问题