当使用OkHttp的WebSocket的listener使用字节串,以提供二进制有效负载到应用程序。我想这些字节反馈到一些代码,这需要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,一个字节数组,只是分配给字节串本身(当从WebSocketReader
IMPL移交)。
我的问题是:是否有从ByteString
读取任何其他的首选方式,通过Source
?由于ByteString
被认为是不可变的和Source
会牵住一些读取位置信息,我想它应该是可行的完美(来自外部的代码,但不是,因为我无法访问byte[]
)..所以感觉就像我M}这里缺少一个明显的解决方案.. :)
感谢您的任何提示或指针!
你写它的方式几乎是最优的。
奥基奥被用于移动变换层之间的数据进行了优化:压缩,成帧,螺纹等。尽管层之间移动数据是超高速(无拷贝)有一个前期成本来获取数据到系统中最初。这通常是I / O需要无论如何做:加载文件或发送的数据包。但在这种情况下,你必须复制得到字节到第一个缓冲区。这种感觉效率不高,但好处是你的下一个Source.read()调用会快,所以整个总体仍然会很大。