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

Efficient okio Source backed by an already allocated ByteString?

使用 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 移交时)。

我的问题是:是否有任何其他首选方法可以通过 SourceByteString 读取数据? 由于 ByteString 应该是不可变的,而 Source 只会保存一些读取位置信息,我认为它应该是完全可行的(但不是来自外部代码,因为我无法访问 byte[])..所以感觉我在这里缺少一个明显的解决方案..:)

感谢任何提示或指点!

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

Okio 针对在转换层之间移动数据进行了优化:压缩、分帧、线程等。尽管在层之间移动数据速度超快(无副本),但最初将数据导入系统需要前期成本。这通常是 I/O 你无论如何都需要做的:加载文件或发送数据包。但在这种情况下,您必须复制才能将字节放入第一个缓冲区。这感觉效率低下,但好处是您的下一个 Source.read() 调用会很快,因此整体的整体效果仍然很好。