通过一个已分配的字节串支持高效奥基奥来源?

问题描述 投票:1回答:1

当使用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}这里缺少一个明显的解决方案.. :)

感谢您的任何提示或指针!

java okhttp okio
1个回答
0
投票

你写它的方式几乎是最优的。

奥基奥被用于移动变换层之间的数据进行了优化:压缩,成帧,螺纹等。尽管层之间移动数据是超高速(无拷贝)有一个前期成本来获取数据到系统中最初。这通常是I / O需要无论如何做:加载文件或发送的数据包。但在这种情况下,你必须复制得到字节到第一个缓冲区。这种感觉效率不高,但好处是你的下一个Source.read()调用会快,所以整个总体仍然会很大。

© www.soinside.com 2019 - 2024. All rights reserved.