当使用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[]
).. 所以我觉得我错过了一个明显的解决办法……)
谢谢你的提示和指点!
1条答案
按热度按时间8nuwlpux1#
你写它的方式几乎是最佳的。
okio针对在转换层之间移动数据进行了优化:压缩、成帧、线程等。虽然在层之间移动数据非常快(没有副本),但最初将数据放入系统需要预先支付成本。不管怎样,这通常是您需要执行的i/o操作:加载文件或发送数据包。但在这种情况下,必须进行复制才能将字节放入第一个缓冲区。这感觉效率很低,但好的一面是你的下一个来源。read()调用会很快,所以整个过程仍然会很好。