跳到内容

Okio

Okio 是一个补充 java.iojava.nio 的库,它让访问、存储和处理数据变得更加容易。它最初是 OkHttp(一个强大的 Android HTTP 客户端)的一个组件。它经过了充分的实践,并已准备好解决新问题。

ByteStrings 和 Buffers

Okio 围绕两种类型构建,它们将强大的功能融入简洁的 API 中

  • ByteString 是一个不可变的字节序列。对于字符数据,String 是基础。ByteString 是 String 失散多年的兄弟,它使得将二进制数据作为值处理变得容易。这个类非常人性化:它知道如何将自身编码和解码为 hex、base64 和 UTF-8。

  • Buffer 是一个可变的字节序列。就像 ArrayList 一样,你不需要预先确定缓冲区的大小。你像队列一样读写缓冲区:数据写入末尾,从开头读取。无需管理位置、限制或容量。

在内部,ByteStringBuffer 做了一些巧妙的事情来节省 CPU 和内存。如果你将 UTF-8 字符串编码为 ByteString,它会缓存对该字符串的引用,这样如果你稍后解码它,就无需额外工作。

Buffer 实现为一个段的链表。当你将数据从一个缓冲区移动到另一个时,它会重新分配段的所有权,而不是跨数据进行复制。这种方法对于多线程程序特别有用:与网络通信的线程可以与工作线程交换数据,而无需任何复制或繁琐操作。

Sources 和 Sinks

java.io 设计的优雅之处在于流可以分层进行转换,如加密和压缩。Okio 包含自己的流类型,称为 SourceSink,它们的工作方式类似于 InputStreamOutputStream,但有一些关键区别

  • 超时。 流提供了对底层 I/O 机制超时的访问。与 java.io 套接字流不同,read()write() 调用都遵守超时设置。

  • 易于实现。 Source 只声明了三个方法:read(), close(), 和 timeout()。没有像 available() 或单字节读取那样可能导致正确性或性能问题的隐患。

  • 易于使用。 虽然 SourceSink实现只有三个方法可写,但调用者通过 BufferedSourceBufferedSink 接口获得了丰富的 API。这些接口将你需要的一切集中在一处。

  • 字节流和字符流之间没有人为区分。 所有都是数据。你可以将其读写为字节、UTF-8 字符串、大端 32 位整数、小端短整数,随心所欲。不再需要 InputStreamReader

  • 易于测试。 Buffer 类实现了 BufferedSourceBufferedSink,因此你的测试代码既简单又清晰。

Sources 和 Sinks 与 InputStreamOutputStream 可以互操作。你可以将任何 Source 看作 InputStream,也可以将任何 InputStream 看作 SourceSinkOutputStream 同理。

演讲

A Few “Ok” Libraries (幻灯片): 介绍 Okio 以及用它编写的三个库。

Decoding the Secrets of Binary Data (幻灯片): 数据编码的工作原理以及 Okio 如何实现。

Ok Multiplatform! (幻灯片): 我们如何将 Okio 的实现语言从 Java 更改为 Kotlin。

Nerding Out On Okio: Okio API 的故事,其设计和权衡,以及带有动画弹珠图的实现说明。

要求

Okio 2.x 支持 Android 4.0.3+ (API level 15+) 和 Java 7+。

Okio 3.x 支持 Android 4.0.3+ (API level 15+) 和 Java 8+。

Okio 依赖于 Kotlin 标准库。它是一个小型库,具有强大的向后兼容性。

发布

我们的变更日志记录了发布历史。

implementation("com.squareup.okio:okio:3.11.0")
也可以获取快照构建版本。
repositories {
  maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
}

dependencies {
  implementation("com.squareup.okio:okio:3.11.0")
}

许可证

Copyright 2013 Square, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   https://apache.ac.cn/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.