跳到内容

变更日志

Version 3.11.0

2025-04-09

  • 修复:清除 deflater 的字节数组引用
  • 新增:在 Kotlin/JS 上实现更快的 String.decodeHex()
  • 新增:为 Closeable.use {}FileSystem.read {} 等代码块声明 EXACTLY_ONCE 执行。
  • 升级:Kotlin 2.1.20

Version 3.10.2

2025-01-08

  • 修复:okio-nodefilesystem 构建产物不再为空。

Version 3.10.1

2025-01-07

  • 新增:FileSystem.close() 可能会根据底层实现阻止未来的访问和/或清理相关资源。FakeFileSystem 在关闭后将阻止后续操作。
  • BufferedSource.inputStream() 创建的 InputStream 现在具有更高效的 InputStream.transferTo() 版本,减少了内存复制。
  • okio-nodefilesystem 不再作为 JS 项目发布,而是作为仅包含 JS 目标的 Kotlin 多平台项目发布。~此更改不应以任何方式影响使用者,其动机是 Kotlin Gradle 插件弃用了仅限 JS 的插件。~ 请使用 3.10.2 以确保此更改确实不影响您的构建。

Version 3.10.0

2025-01-06

此版本等同于随后的 3.10.1,但由于基础设施问题,未能完全发布到 Maven Central。

Version 3.9.1

2024-09-12

  • 修复:在 Path.relativeTo 中支持包含单个点(“.”)的路径。
  • 修复:当请求 0 字节读取时,不从上游源读取。
  • 修复:更新 kotlinx.datetime 到 0.6.0 以纠正 0.5.0 中的 Gradle 模块元数据问题。注意:此构建产物仅在 ‘okio-fakefilesystem’ 和 ‘okio-nodefilesystem’ 中使用,不在 Okio 核心库中使用。

Version 3.9.0

2024-03-12

  • 新增:FileSystem.SYSTEM 可用于同时面向 Kotlin/Native 和 Kotlin/JVM 的源集。以前,我们在每个源集中都有此符号,但它对于通用源集不可用。
  • 新增:COpaquePointer.readByteString(...) 从内存地址创建 ByteString。
  • 新增:在 Kotlin/Native 中支持 InflaterSourceDeflaterSinkGzipSinkGzipSource
  • 新增:在 Kotlin/Native 上支持 openZip()。此实现中一个已知错误是 FileMetadata.lastModifiedAtMillis() 被解释为 UTC 时间而非主机的时间区。
  • 新增:在 ZIP 文件系统元数据中优先使用 NTFS 时间戳。这避免了 ZIP 内置 DOS 时间戳的时区问题,以及 ZIP 扩展时间戳的 2038 年问题。
  • 修复:不要泄漏 FileSystem.RESOURCES 中打开的 JAR 文件的文件句柄。
  • 修复:如果 Closeable.use { ... } 返回 null,则不抛出 NullPointerException

Version 3.8.0

2024-02-09

  • 新增:TypedOptions 的工作方式类似 Options,但它返回 T 而不是索引。
  • 修复:在 Pipe.fold() 中出现竞争时,不要让 sink 保持打开状态。

Version 3.7.0

2023-12-16

  • 新增:Timeout.cancel() 阻止超时触发。
  • 重大变更:移除 watchosX86 Kotlin/Native 目标。根据 Kotlin 博客,‘这是针对 Intel Mac 的过时模拟器。请改用 watchosX64 目标。’
  • 新增:添加 watchosDeviceArm64 Kotlin/Native 目标。
  • 新增:接受 kotlin.time.DurationTimeout API。
  • 升级:Kotlin 1.9.21

Version 3.6.0

2023-10-01

  • 修复:在 ZipFileSystem 上使用 metadata 函数时,不要泄漏文件句柄。我们曾有一个 bug,我们在关闭 `.zip` 文件时,没有关闭其中的一个流。如果我们当时在测试中使用了 `FakeFileSystem.checkNoOpenFiles()`,就能避免这个 bug 了!
  • 修复:不要在 ResourceFileSystem.read() 中构建类加载器资源的索引。此操作不需要此索引,且构建它可能开销很大。
  • 新增:实验性支持 Kotlin/Native 目标的 ARM64 Linux (linuxArm64)。请注意,我们尚未为此平台添加 CI 测试覆盖。
  • 升级:Kotlin 1.9.10

Version 1.17.6

2023-10-01

  • 修复:当可选附加数据 (XLEN) 大于或等于 32 KiB 时,解码 GZIP 文件不会崩溃。

Version 3.5.0

2023-08-02

  • 新增:支持 WebAssembly (WASM) 平台。Okio 对 WASM 的支持是实验性的,但正在改进,就像 Kotlin 对 WASM 的支持一样。
  • 新增:使用 WasiFileSystem 将 WebAssembly 系统接口 (WASI) API 集成到 Okio FileSystem 中。这位于新的 okio-wasifilesystem 模块中。它需要 preview1 WASI API。随着新的 WASI API 版本可用,我们将进行向后不兼容的升级。
  • 修复:在需要时,NIO 适配器 FileSystem 返回相对路径。FileSystem.list() 以前总是返回绝对路径,即使目标目录是以相对路径提供的。
  • 修复:在 Kotlin/Native 上使用 FileHandle 读取到空数组时,不会崩溃。
  • 升级:Kotlin 1.9.0

Version 3.4.0

2023-07-07

  • 新增:使用 fileSystem.asOkioFileSystem() 将 Java NIO FileSystem (java.nio.file.FileSystem) 集成到 Okio FileSystem 中。
  • 新增:使用 AssetFileSystem 将 Android 的 AssetManager 集成到 Okio FileSystem 中。这位于新的 okio-assetfilesystem 模块中。Android 应用应优先使用此方法而非 FileSystem.RESOURCES,因为它加载更快。
  • 修复:当可选附加数据 (XLEN) 大于或等于 32 KiB 时,解码 GZIP 文件不会崩溃。
  • 修复:在 FakeFileSystem.canonicalize() 中解析符号链接。
  • 修复:在 NodeJsFileSystem 文件元数据中报告正确的 createdAtMillis。我们之前错误地使用了 ctimeMs,其中的 c 表示更改,而非创建
  • 修复:UnsafeCursor 现在是 Closeable 的。

Version 3.3.0

2023-01-07

  • 修复:当 use {} 与非局部返回一起使用时,不要泄漏资源。我们引入此性能和稳定性错误是因为未考虑非局部返回既不执行 return 控制流,也不执行 catch 控制流。
  • 修复:对 BufferedSinkBufferedSource 使用密封接口。它们从未打算供最终用户实现,我们很高兴 Kotlin 现在允许我们在 API 中表达这一点。
  • 新增:将内部锁从 synchronized 更改为 ReentrantLockCondition。我们期望这在使用 Okio 与 Java 虚拟线程(Project Loom)时有所帮助。
  • 升级:Kotlin 1.8.0

Version 3.2.0

2022-06-26

  • 修复:将多平台构建产物 (com.squareup.okio:okio:3.x.x) 配置为在 Maven 构建中依赖于 JVM 构建产物 (com.squareup.okio:okio-jvm:3.x.x)。这应该能解决 Maven 不解析 Gradle 元数据的问题。
  • 修复:更改 CipherSourceCipherSink,使其在 cipher 不支持流式处理时能够恢复。这应该能解决 Android 上使用 AES/GCM ciphers 时崩溃的问题。
  • 新增:启用对非分层项目的兼容性。

Version 3.1.0

2022-04-19

  • 升级:Kotlin 1.6.20
  • 新增:支持分层项目结构。如果您在多平台项目中使用 Okio,请将您的项目升级到 Kotlin 1.6.20(或更高版本)以利用此特性。使用分层项目,更容易使用 FileSystem.SYSTEM 等属性,这些属性在大多数 Okio 平台上可用,但并非全部平台都可用。
  • 新增:ForwardingSource 现在在所有平台上可用。
  • 新增:现在支持 watchosX64 平台。
  • 修复:当输入为空时,在 `NSData.toByteString()` 中不会崩溃。
  • 修复:在 FileSystem.openZip() 中支持空 ZIP 文件。
  • 修复:如果路径不存在,则在 ZIP 文件系统的 canonicalize() 中抛出异常。
  • 修复:不再要求 ZIP 文件以本地文件头开始。
  • 新增:okio.ProtocolException 是面向多平台用户的新异常类型。(在 JVM 平台上,它是 java.net.ProtocolException 的别名)。

Version 3.0.0

2021-10-28

这是 Okio 3.x 的第一个稳定版本。此版本与 Okio 2.x 高度向后兼容,新主版本更多地代表了新功能,而非向后不兼容。

大多数用户只需更改版本即可从 2.x 升级。如果您在 Kotlin 多平台项目中使用 Okio,您需要在 Gradle 依赖中去掉 -multiplatform 后缀。

  • 新增:移除 @ExperimentalFileSystem。由于文件系统不再是实验性的,此注解不再需要!
  • 新增:Path 不再积极地规范化 .. 段。使用 Path.normalize() 根据路径内容应用这些规范化,或使用 FileSystem.canonicalize() 在特定文件系统上遵照符号链接进行规范化。
  • 新增:为 Okio 发布物料清单 (BOM)。从 Gradle 或 Maven 依赖此 BOM,即使通过传递依赖声明,也能使您的所有 Okio 构建产物保持同一版本。您甚至可以在声明其他 Okio 依赖时省略版本号。
dependencies {
   api(platform("com.squareup.okio:okio-bom:3.0.0"))
   api("com.squareup.okio:okio")                // No version!
   api("com.squareup.okio:okio-fakefilesystem") // No version!
}
  • 新增:FileSystem.delete() 在删除不存在的文件时静默成功。使用新的 mustExist 参数来触发异常。
  • 新增:FileSystem.createDirectories() 在创建已存在的目录时静默成功。使用新的 mustCreate 参数来触发异常。
  • 新增:FileSystem 在适当时提供 Java 语言的重载。以前,具有默认参数的函数从 Java 调用可能不太方便。
  • 新增:Timeout.intersectWith() 返回一个值而不是 Unit。这是一个二进制不兼容的更改。我们预计此公共 API 在 Okio 之外很少被使用。
  • 修复:更改 BufferedSource.readDecimalLong(),如果输入值仅为 - 则失败。之前 Okio 对此错误地返回了 0

Version 3.0.0-alpha.11

2021-10-23

  • 升级:Kotlin 1.5.31
  • 升级:kotlinx-datetime 0.3.0。(这仅是 okio-fakefilesystem 的依赖项。)
  • 新增:支持创建和访问符号链接。我们曾不愿在 API 中包含符号链接(为了保持精简!),但后来认为支持它们对于正确实现递归遍历至关重要。
  • 新增:FileMetadata.extras 可以跟踪自定义 FileSystem 实现的元数据。
  • 新增:支持 Apple Silicon Kotlin/Native 目标 (macosArm64, iosSimulatorArm64, tvosSimulatorArm64, 和 watchosSimulatorArm64)。
  • 新增:FileSystem.listRecursively() 返回一个 Sequence,包含目录的所有子项及其所有子项的递归列表。实现采用懒惰的深度优先遍历。
  • 新增:Path.relativeTo() 计算从一个路径到另一个路径的方式。
  • 新增:Path.rootPath.segments。这些 API 将路径分解为其组成部分。
  • 新增:FileSystem.listOrNull() 返回目录的子项列表,如果路径不引用可读目录则返回 null。
  • 新增:如果正在更新的文件不存在则失败的选项:mustExist。当您意图是更新现有文件时,使用此选项可避免创建新文件。
  • 新增:如果正在创建的文件已存在则失败的选项:mustCreate。当您意图是创建新文件时,使用此选项可避免更新现有文件。
  • 修复:恢复对浏览器平台上的 Kotlin/JS 支持。我们之前依赖仅 NodeJS 的特性来获取本地目录分隔符(/\)和临时目录。
  • 修复:在 Linux 上的 Kotlin/Native 中运行 Okio 时,不要忽略调用者指定的写入偏移量。(FileHandle.write() 之前有 bug,总是追加到文件末尾。)

Version 3.0.0-alpha.10

2021-09-09

此版本移除了 Kotlin 多平台构建产物上的 -multiplatform 后缀。所有构建产物(例如 com.squareup.okio:okio:3.0.0-alpha.10)现在对 Kotlin/JVM 和 Kotlin 多平台使用相同的名称。

  • 修复:当 classpath 中的 .jar 文件路径包含特殊字符时,在 ResourceFileSystem 中不会崩溃。

Version 3.0.0-alpha.9

2021-08-01

  • 新增:ByteString.copyInto() 在从 ByteString 提取数据时节省了一次分配。
  • 修复:创建 FileHandle.protectedSize() 以匹配其他抽象函数。
  • 修复:在 Windows 上以二进制模式打开文件。否则,包含 0x1a 的文件将被过早截断。

Version 3.0.0-alpha.8

2021-07-13

  • 修复:在 .zip 文件中存在重复条目时不会崩溃。
  • 修复:更改 FileSystem.RESOURCES 为延迟初始化。

Version 3.0.0-alpha.7

2021-07-12

  • 修复:更改 ResourceFileSystem 为主动加载根目录。我们之前有一个 bug,即使资源存在,对根目录调用 list() 也返回空列表。
  • 新增:FileHandle.reposition() 可以在该 FileHandle 返回的 source 或 sink 上进行 seek 操作。
  • 新增:将系统资源实例移至 FileSystem.RESOURCES
  • 升级:Kotlin 1.5.20

Version 3.0.0-alpha.6

2021-06-01

  • 新增:FileHandle 支持对文件进行随机访问读、写和调整大小。使用 FileSystem.openReadOnly()FileSystem.openReadWrite() 创建实例。
  • 新增:移除被 FileHandle 废弃的 Cursor。(UnsafeCursor 仍然存在!)
  • 新增:添加对 Kotlin/JS 中新的中间表示 (IR) 构建产物的支持。我们仍然支持传统的构建产物格式。
  • 新增:在多平台中支持 tvOS (tvosArm64, tvosX64)。
  • 新增:更改 ResourceFileSystem 在索引 .zip 文件时省略 .class 文件。我们期望这能降低 ResourceFileSystem 的内存占用。
  • 修复:在 Kotlin/Native 中后台线程访问时不会崩溃。我们必须应用 @SharedImmutable 并在后台线程上运行测试套件。

Version 3.0.0-alpha.5

2021-04-27

  • 新增:将 ZipFileSystemResourceFileSystem 提升到 Okio 主模块。它们目前仅支持 JVM。okio-zipfilesystem 模块不再发布。

Version 3.0.0-alpha.4

2021-04-14

  • 修复:重命名内部类以避免名称冲突。我们之前遇到问题,因为有多个文件命名为 -Platform.kt

Version 3.0.0-alpha.3

2021-04-06

  • 新增:将 NodeJsFileSystem 移至其自己的模块。将其内置会阻止 Okio 在没有同步文件系统 API 的浏览器中工作。这位于 okio-nodefilesystem 构建产物中。

Version 3.0.0-alpha.2

2021-03-24

  • 新增:Okio 3.x 需要 Java 8+。
  • 新增:Cursor 支持对 Source 进行随机访问读。
  • 新增:FileSystem.openZip(path) 返回由 .zip 文件支持的文件系统。这位于 okio-zipfilesystem 构建产物中。

Version 3.0.0-alpha.1

2021-01-07

  • 新增:实验性文件系统 API。PathFileMetadataFileSystemForwardingFileSystem 类型在未来版本中可能会发生 API 更改。
  • 新增:实验性 okio-fakefilesystem 构建产物。

Version 2.10.0

2021-01-07

  • 新增:在多平台中支持 Windows (mingwX64)。
  • 新增:在多平台中支持 watchOS (watchosArm32, watchosArm64, watchosX86)。
  • 新增:在非 JVM 平台上支持 HashingSourceHashingSink、缓冲区哈希函数和 UnsafeCursor。之前这些都仅限于 JVM。
  • 新增:在非 JVM 平台上的 SinkSource 上实现 Closeable。Okio 现在包含一个多平台 okio.Closeable 接口和相应的 use {} 扩展函数。使用完资源后关闭它们不应该仅限于 JVM!
  • 新增:Sink.hashingSinkSource.hashingSource 函数,接受 java.security.MessageDigestjavax.crypto.Mac 实例。当您的哈希函数不是内置时使用这些函数。
  • 修复:在 Android 上的 CipherSinkCipherSource 中,不会因 ShortBufferException 而崩溃。(即使缓冲区不短,Android 也可能抛出 ShortBufferException。我们现在避免了这个问题!)
  • 升级:Kotlin 1.4.20

Version 2.9.0

2020-10-04

  • 修复:写入分段 ByteString 的切片时,不会损坏 Buffer。我们之前有一个严重的 bug,通过 snapshot()readByteString() 创建的 ByteString 实例错误地根据其完整长度而非切片的长度调整了缓冲区的尺寸。这会导致缓冲区读取崩溃!我们不认为数据被静默损坏了。
  • 新增:CipherSinkCipherSource。将其与 javax.crypto.Cipher 一起使用来加密和解密数据流。这是一个低级别的加密 API;大多数应用应在可用时使用更高级别的 API,如 TLS。
  • 新增:将哈希函数 md5sha1()sha512()sha256() 提升到通用 Kotlin。它们目前仅在 ByteString 上可用,对 HashingSourceHashingSinkBuffer 的多平台支持将在后续版本中提供。我们在 Kotlin 中编写并优化了这些哈希函数的实现。在 JVM 和 Android 平台上,Okio 仍然使用平台内置的哈希函数。
  • 新增:支持 OSGi 元数据。
  • 升级:Kotlin 1.4.10

Version 2.8.0

2020-08-17

  • 新增:升级到 Kotlin 1.4.0。

Version 2.7.0

2020-07-07

  • 新增:Pipe.cancel() 导致管道上正在进行和未来的读写操作立即失败并抛出 IOException。流仍可以正常取消。

  • 新增:将 Okio 的内部段池从固定的总计 64 KiB 扩大到每个处理器 64 KiB。例如,在 Intel i9 8 核/16 线程机器上,段池现在最多使用 1 MiB 内存。

  • 新增:访问段池时从 synchronized 迁移到无锁。结合上述更改,在旨在制造争用的合成基准测试中,我们看到吞吐量提高了 3 倍。

Version 2.6.0

2020-04-22

  • 新增:InflaterSource.readOrInflate() 类似于 InflaterSource.read(),不同之处在于如果从底层流消耗的 deflated 字节未产生新的 inflated 字节,它将返回 0。

Version 2.5.0

2020-03-20

  • 新增:升级到 Kotlin 1.3.70。

Version 2.4.3

2019-12-20

  • 新增:升级到 Kotlin 1.3.61。

Version 2.4.2

2019-12-11

  • 修复:当 InputStream 源恰好在缓冲区段边界耗尽时,不会崩溃。我们之前有一个 bug,一系列读取可能违反缓冲区的不变性,这可能导致后续读取遇到意外的空段时崩溃。

Version 1.17.5

2019-12-11

  • 修复:当 InputStream 源恰好在缓冲区段边界耗尽时,不会崩溃。我们之前有一个 bug,一系列读取可能违反缓冲区的不变性,这可能导致后续读取遇到意外的空段时崩溃。

Version 2.4.1

2019-10-04

  • 修复:在 Kotlin/Native 上不要缓存 ByteString 中的哈希码和 UTF-8 字符串,这会阻止 freezing。

Version 2.4.0

2019-08-26

  • 新增:升级到 Kotlin 1.3.50。

Version 2.3.0

2019-07-29

**此版本将我们的构建从 Kotlin-JVM 更改为 Kotlin 多平台(包含 JVM)。** Native 和 JavaScript 平台都是不稳定的预览版本,未来版本可能会有向后不兼容的更改。

要在多平台项目中使用 Okio,请使用此 Maven 坐标

api('com.squareup.okio:okio-multiplatform:2.3.0')

您还需要在项目设置中启用 Gradle 元数据。JVM 项目的构建产物名称没有更改。

  • 新增:升级到 Kotlin 1.3.40。
  • 修复:kotlin-stdlib 依赖使用 Gradle api 而非 implementation
  • 修复:除非绝对必要,否则不要在 BufferedSource.peek() 中阻塞。

Version 1.17.4

2019-04-29

  • 修复:除非绝对必要,否则不要在 BufferedSource.peek() 中阻塞。

Version 2.2.2

2019-01-28

  • 修复:使 Pipe.fold() 在必要时关闭底层 sink。

Version 1.17.3

2019-01-28

  • 修复:使 Pipe.fold() 在必要时关闭底层 sink。

Version 1.17.2

2019-01-17

  • 修复:使 Pipe.fold() 刷新底层 sink。

Version 2.2.1

2019-01-17

  • 修复:使 Pipe.fold() 刷新底层 sink。

Version 2.2.0

2019-01-16

  • 新增:Throttler 限制 sources 和 sinks 的最大期望吞吐量。多个 sources 和 sinks 可以连接到同一个 throttler,它们的总吞吐量不会超过期望的吞吐量。同一个 source 或 sink 上也可以使用多个 throttlers,它们都将被遵守。

  • 新增:Pipe.fold() 将主动可读的 Source 替换为被动可写的 Sink。这可用于将一个 sink 转发到最初未确定的目标。

  • 新增:优化使用 Buffer.snapshot() 创建的 ByteStrings 的性能。

Version 1.17.1

2019-01-16

  • 修复:将新移植的 Pipe.fold() 设为 public。

Version 1.17.0

2019-01-16

  • 新增:将 Pipe.fold() 移植回 Okio 1.x。

Version 1.16.0

2018-10-08

  • 新增:将 BufferedSource.peek()BufferedSource.getBuffer() 移植回 Okio 1.x。
  • 修复:关闭 AsyncTimeout sources 时强制执行超时。

Version 2.1.0

2018-09-22

  • 新增:BufferedSource.peek() 返回另一个 BufferedSource,它在当前 source 上预读。使用此方法多次处理相同的数据。

  • 新增:废弃 BufferedSource.buffer(),替换为 BufferedSource.getBuffer() (在 Java 中) 或 BufferedSource.buffer (在 Kotlin 中)。我们对 BufferedSink 也做了同样的处理。在 Okio 2.0 中引入新的扩展方法 Source.buffer() 时,我们无意中与现有方法冲突。此更改修复了这个问题。

  • 新增:改进 Buffer.writeUtf8() 的性能。这与 JavaScript 中 UTF-8 编码和解码的初步实现同时进行,该实现使用XOR 掩码以获得出色性能。

Version 2.0.0

2018-08-27

此版本致力于提供稳定的 2.0 API。请阅读 2.0.0-RC1 的更改说明,以获取从 1.x 升级到 2.x 的建议。

我们还添加了 API,以方便 Kotlin 用户迁移。它们使用 Kotlin 的 @Deprecated 注解,帮助您将调用点从 1.x 风格更改为 2.x 风格。

Version 2.0.0-RC1

2018-07-26

Okio 2 是一个主要版本,将库的实现语言从 Java 升级到 Kotlin。

Okio 2.x 与 Okio 1.x **二进制兼容**,不改变任何行为。针对 1.x 编译的类和 .jar 文件可以在 2.x 中直接使用,无需重新编译。

Okio 2.x 与 Okio 1.x **.java 源代码兼容**,除了一种极端情况。在 Okio 1.x 中,当尝试读取超过可用字节数时,Buffer 会抛出未检查的 IllegalStateException。Okio 2.x 在这种情况下现在抛出检查的 EOFException。这现在与其 BufferedSource 接口的行为一致。未捕获 IOException 的 Java 调用者现在需要捕获它。

Okio 2.x 与 Okio 1.x **.kt 源代码不兼容**。此版本采用了 Kotlin 的惯用法。

Java Kotlin 惯用法
Buffer.getByte() operator fun Buffer.get() 运算符函数
Buffer.size() val Buffer.size val
ByteString.decodeBase64(String) fun String.decodeBase64() 扩展函数
ByteString.decodeHex(String) fun String.decodeHex() 扩展函数
ByteString.encodeString(String, Charset) fun String.encode(Charset) 扩展函数
ByteString.encodeUtf8(String) fun String.encodeUtf8() 扩展函数
ByteString.getByte() operator fun ByteString.get() 运算符函数
ByteString.of(ByteBuffer) fun ByteBuffer.toByteString() 扩展函数
ByteString.of(byte[], int, int) fun ByteArray.toByteString() 扩展函数
ByteString.read(InputStream, int) fun InputStream.readByteString(Int) 扩展函数
ByteString.size() val ByteString.size val
DeflaterSink(Sink) fun Sink.deflater() 扩展函数
ForwardingSink.delegate() val ForwardingSink.delegate val
ForwardingSource.delegate() val ForwardingSource.delegate val
GzipSink(Sink, Deflater) fun Sink.gzip() 扩展函数
GzipSink.deflater() val GzipSink.deflater val
GzipSource(Source) fun Source.gzip() 扩展函数
HashingSink.hash() val HashingSink.hash val
HashingSource.hash() val HashingSource.hash val
InflaterSink(Source) fun Source.inflater() 扩展函数
Okio.appendingSink(File) fun File.appendingSink() 扩展函数
Okio.blackhole() fun blackholeSink() 顶层函数
Okio.buffer(Sink) fun Sink.buffer() 扩展函数
Okio.buffer(Source) fun Source.buffer() 扩展函数
Okio.sink(File) fun File.sink() 扩展函数
Okio.sink(OutputStream) fun OutputStream.sink() 扩展函数
Okio.sink(Path) fun Path.sink() 扩展函数
Okio.sink(Socket) fun Socket.sink() 扩展函数
Okio.source(File) fun File.source() 扩展函数
Okio.source(InputStream) fun InputStream.source() 扩展函数
Okio.source(Path) fun Path.source() 扩展函数
Okio.source(Socket) fun Socket.source() 扩展函数
Pipe.sink() val Pipe.sink val
Pipe.source() val Pipe.source val
Utf8.size(String) fun String.utf8Size() 扩展函数

Okio 2.x 的性能与 Okio 1.x **相似**。我们对两个版本进行了基准测试,以发现潜在的性能退化。我们发现并修复了一个退化:我们之前使用了 == 而非 ===

此版本的其他更改

  • 新增:添加对 kotlin-stdlib 的依赖。Okio 的传递依赖从 1.x 的零个增加到 2.x 的三个。它们是 kotlin-stdlib (939 KiB)、kotlin-stdlib-common (104 KiB) 和 JetBrains 的注解 (17 KiB)。

  • 新增:将 Okio 的构建工具从 Maven 更改为 Gradle。

Version 1.15.0

2018-07-18

  • 新增:基于 Trie 的 Buffer.select()。这提高了在大型选项列表中进行选择时的性能。
  • 修复:抛出 InterruptedIOException 时保留中断状态。

Version 1.14.0

2018-02-11

  • 新增:Buffer.UnsafeCursor 提供对 Okio 内部结构的直接访问。此 API 类似于 Okio 的 Java 反射版本:它是一个非常强大的 API,既可用于实现伟大功能,也可用于危险操作。文档很详尽,任何使用它的人都应该仔细阅读后再进行操作!
  • 新增:更改 BufferedSource 以实现 java.nio.ReadableByteChannel,并更改 BufferedSink 以实现 java.nio.WritableByteChannel。现在 Okio 和 NIO 之间的互操作性变得更容易了一些。
  • 新增:自动模块名称 okio,用于 Java 平台模块系统。
  • 新增:优化 Buffer.getByte() 方法,使其在反向搜索更有效时进行反向搜索。
  • 修复:InflaterSource 遵循请求的字节数。此前该类可能会返回比请求更多的字节数。
  • 修复:改进 AsyncTimeout.sink().write() 中的性能 bug。

版本 1.13.0

2017-05-12

  • Okio 现在使用 @Nullable 来标注所有可能为空的值。 我们添加了对 JSR 305 注解的编译时依赖。这是一个 provided(已提供)依赖,无需将其包含在您的构建配置、.jar 文件或 .apk 中。我们使用 @ParametersAreNonnullByDefault,并且所有参数和返回类型除非明确标注为 @Nullable,否则永不为空。

  • 警告:此版本对于 Kotlin 用户来说是源代码不兼容的。 此前 nullability(可空性)是模糊且宽松的,但现在编译器将强制执行严格的 null 检查。

版本 1.12.0

2017-04-11

  • 修复:更改 Pipe 的 sink.flush() 使其不阻塞。 此前,关闭 pipe 的 sink 会阻塞,直到 source 被耗尽。实际上,这会阻塞调用方而没有任何益处。
  • 修复:更改 writeUtf8CodePoint() 使其对部分代理字符(partial surrogates)发出 ? 此前的行为不一致:对于包含部分代理字符的格式错误的字符串,writeUtf8() 会发出 ?,但 writeUtf8CodePoint() 会抛出 IllegalArgumentException。大多数应用程序永远不会遇到部分代理字符,但对于那些遇到的应用程序来说,此行为是出乎意料的。
  • 新增:允许限制 readUtf8LineStrict() 的长度。
  • 新增:Utf8.size() 方法,用于获取将字符串编码为 UTF-8 所需的字节数。这对于长度前缀编码可能有用。
  • 新增:SHA-512 哈希和 HMAC API。

版本 1.11.0

2016-10-11

  • 修复:Buffer.writeString() 的四参数重载存在一个重大 bug,如果指定的字符集是 UTF-8,它将不遵循偏移量。 这是因为我们的短路优化省略了必要的偏移参数。
  • 新增:在 HashingSourceHashingSinkByteStringBuffer 中支持 HMAC。这使得无论您的数据在哪里,都可以轻松创建基于哈希的消息认证码 (HMAC)。与其他哈希不同,HMAC 使用一个 ByteString 密钥进行认证。
  • 新增:ByteString.of(ByteBuffer) 使 NIO 与 Okio 的混合使用更加容易。

版本 1.10.0

2016-08-28

  • 修复:支持使用 GzipSource 读取大于 2 GiB 的文件。此前,尝试解压此类文件会因验证总长度时发生溢出而失败。
  • 修复:空闲 60 秒后退出看门狗线程。这应该使得类卸载器能够完全卸载 Okio。
  • 新增:Okio.blackhole() 返回一个 sink,所有写入的字节都会被丢弃。这是 Okio 相当于 /dev/null 的功能。
  • 新增:使用 ByteString.encodeString() 通过任何字符集编码字符串,并使用 ByteString.string() 通过任何字符集解码字符串。除非需要支持旧版字符集,否则大多数应用程序应优先使用 ByteString.encodeUtf8()ByteString.utf8()
  • 新增:GzipSink.deflater() 使得配置压缩级别成为可能。

版本 1.9.0

2016-07-01

  • 新增:Pipe 使得连接生产者线程和消费者线程变得容易。读取会阻塞,直到有数据可读。如果 pipe 已满,写入会阻塞。sources 和 sinks 都支持超时。
  • 新增:BufferedSource.rangeEquals() 使得比较流中某个范围与预期值变得容易。它做了正确的事情:它会阻塞以加载所需的数据来返回确定性结果。但它不会不必要地阻塞。
  • 新增:Timeout.waitUntilNotified() 使得在 Java 内置的 wait/notify 原语上使用良好的超时抽象成为可能。
  • 修复:当 HashingSource 进行大批量读取时,不返回错误结果。之前存在一个 bug,它没有遍历被哈希的 buffer 的 segments。这意味着对于跨越多个 segment 边界的任何写入,HashingSource 返回了错误的结果。

版本 1.8.0

2016-05-02

  • 新增:BufferedSource.select(Options) API,用于读取一组预期值中的一个。
  • 新增:使 ByteString.toString()Buffer.toString() 更加友好。如果字节字符串是有效的 UTF-8,这些方法将返回文本。
  • 新增:用于匹配字节字符串的 API:indexOf()startsWith()endsWith()

版本 1.7.0

2016-04-10

  • 新增:将 segment 大小更改为 8 KiB。据报告,这在某些应用程序中显著提高了性能。
  • 新增:Buffer 上的 md5()sha1()sha256() 方法。同时在 ByteString 上添加 sha1() 方法以保持对称。
  • 新增:HashingSourceHashingSink。这些类相当于 JDK 的 DigestInputStreamDigestOutputStream。它们提供了方便的 md5()sha1()sha256() 工厂方法,以避免不可能出现的 NoSuchAlgorithmException
  • 新增:ByteString.asByteBuffer()
  • 修复:将快照字节字符串限制为请求的大小。
  • 修复:更改写超时以具有最大写入大小。此前,大批量写入很容易发生超时,因为整个写入操作都受一个单一超时的限制。
  • 修复:从 EBADF 故障中恢复,这些故障可能由在旧版本 Android 上异步关闭流引起。
  • 修复:如果共享 segments 只能节省少量复制,则不共享。这应该能提高所有应用程序的性能。
  • 修复:优化 BufferedSource.indexOfElement()indexOf(ByteString)。此前此方法有一个 bug,导致其在大型 buffer 上非常慢。

版本 1.6.0

2015-08-25

  • 新增:BufferedSource.indexOf(ByteString) 在 source 中搜索字节字符串的下一个出现位置。
  • 修复:从在 Android 4.2.2 及更早版本上异步关闭 socket 时抛出的意外 AssertionError 中恢复。

版本 1.5.0

2015-06-19

  • Socket 流现在抛出 SocketTimeoutException。这基于 AsyncTimeout 中的新扩展点,用于在发生超时时自定义异常。
  • 新增:ByteString 现在实现了 Comparable 接口。比较按无符号字节排序:ff00 之后排序。

版本 1.4.0

2015-05-16

  • 超时异常变更。 此前,Timeout.throwIfReached() 在线程中断时会抛出 InterruptedIOException,在达到截止时间时会抛出 IOException。现在在这两种情况下都抛出 InterruptedIOException
  • 修复:尝试从空 source 读取数字时抛出 EOFException。此前这会导致 unchecked 异常崩溃。
  • 新增:无需分配字符串即可读写 UTF-8 码点的 API。
  • 新增:BufferedSink 现在可以直接写入子字符串,这对于某些调用者来说可能节省内存分配。
  • 新增:ForwardingTimeout 类。

版本 1.3.0

2015-03-16

  • 新增:在 BufferedSourceBufferedSink 中读写有符号十进制和无符号十六进制值。与替代方法不同,这些方法不进行任何内存分配!
  • 新增:Segment 共享。通过在 buffers 之间共享底层 segments,这提高了 Buffer.clone()Buffer.copyTo() 等操作的运行时性能。
  • 新增:Buffer.snapshot() 返回 buffer 的不可变快照作为 ByteString。这基于 segment 共享,因此快照是浅拷贝且不可变的。
  • 新增:ByteString.rangeEquals()
  • 新增:ByteString.md5()ByteString.sha256()
  • 新增:ByteString.base64Url() 返回 URL 安全的 Base64 字符串。现有的解码方法已扩展以支持 URL 安全的 Base64 输入。
  • 新增:ByteString.substring() 返回前缀、中缀或后缀。
  • 新增:Sink 现在实现了 java.io.Flushable 接口。
  • 修复:Buffer.write(Source, long) 现在总是完全写入。此前的行为是只要写入了任何数据就会立即返回;这与 API 中所有其他 write() 方法不一致。
  • 修复:不在 DeflaterSink 和 InflaterSource 中泄露空 segments。(这在实践中不太可能引起问题。)

版本 1.2.0

2014-12-30

  • 修复:Okio.buffer() *总是*进行缓冲以获得更好的可预测性。
  • 修复:在 readUtf8LineStrict() 抛出异常时提供上下文信息。
  • 修复:Buffers 在进行零字节写入时,不通过 Source 调用。

版本 1.1.0

2014-12-11

  • 本地执行 UTF-8 编码以提高性能,尤其是在 Android 上。
  • 新增 API:BufferedSink.emit()BufferedSource.request()BufferedSink.indexOfElement()
  • 修复了 Buffer.indexOf() 中的一个性能 bug。

版本 1.0.1

2014-08-08

  • BufferedSource 中添加了 read(byte[])read(byte[], offset, byteCount)void readFully(byte[]) 方法。
  • 细化了 Buffer 方法上声明的 checked 异常。

版本 1.0.0

2014-05-23

  • 提升了发布版本号。没有其他更改!

版本 0.9.0

2014-05-03

  • 使用 0 作为无超时的标记值。
  • 将 AsyncTimeout 改为 public。
  • 从 Buffer.readByteArray 中移除 checked 异常。

版本 0.8.0

2014-04-24

  • 对 public API 提前验证前置条件。
  • 对 Buffer 实例等效性进行快速返回。
  • 为 Sink 和 Source 添加委托类型。
  • deadline 管理方式的小改动。
  • 为 File 添加 Okio.sink 的追加变体方法。
  • 将 BufferedSource 耗尽为 byte[] 和 ByteString 的方法。

版本 0.7.0

2014-04-18

  • 在 timeout 中不使用 getter 方法。
  • 使用看门狗中断已达到截止时间的 sockets。
  • 添加 java.io 和 java.nio 文件 source/sink 助手方法。

版本 0.6.1

2014-04-17

  • 以 UTF-8 或提供的字符集完整读取 buffered source 的方法。
  • 直接读取 byte[] 的 API。
  • 将所有数据从 source 移动到 sink 的新方法。
  • 修复 input stream 耗尽时的 bug。

版本 0.6.0

2014-04-15

  • 使 ByteString 可序列化。
  • 新增 API:ByteString.of(byte[] data, int offset, int byteCount)
  • 新增 API:基于 stream 的复制、写入和读取助手方法。

版本 0.5.0

2014-04-08

  • 首次公开发布。
  • 从 OkHttp 导入。