变更日志¶
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 中支持
InflaterSource、DeflaterSink、GzipSink和GzipSource。 - 新增:在 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()阻止超时触发。 - 重大变更:移除
watchosX86Kotlin/Native 目标。根据 Kotlin 博客,‘这是针对 Intel Mac 的过时模拟器。请改用 watchosX64 目标。’ - 新增:添加
watchosDeviceArm64Kotlin/Native 目标。 - 新增:接受
kotlin.time.Duration的TimeoutAPI。 - 升级: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控制流。 - 修复:对
BufferedSink和BufferedSource使用密封接口。它们从未打算供最终用户实现,我们很高兴 Kotlin 现在允许我们在 API 中表达这一点。 - 新增:将内部锁从
synchronized更改为ReentrantLock和Condition。我们期望这在使用 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 元数据的问题。 - 修复:更改
CipherSource和CipherSink,使其在 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.root和Path.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
- 新增:将
ZipFileSystem和ResourceFileSystem提升到 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。
Path、FileMetadata、FileSystem和ForwardingFileSystem类型在未来版本中可能会发生 API 更改。 - 新增:实验性
okio-fakefilesystem构建产物。
Version 2.10.0¶
2021-01-07
- 新增:在多平台中支持 Windows (mingwX64)。
- 新增:在多平台中支持 watchOS (watchosArm32, watchosArm64, watchosX86)。
- 新增:在非 JVM 平台上支持
HashingSource、HashingSink、缓冲区哈希函数和UnsafeCursor。之前这些都仅限于 JVM。 - 新增:在非 JVM 平台上的
Sink和Source上实现Closeable。Okio 现在包含一个多平台okio.Closeable接口和相应的use {}扩展函数。使用完资源后关闭它们不应该仅限于 JVM! - 新增:
Sink.hashingSink和Source.hashingSource函数,接受java.security.MessageDigest和javax.crypto.Mac实例。当您的哈希函数不是内置时使用这些函数。 - 修复:在 Android 上的
CipherSink和CipherSource中,不会因ShortBufferException而崩溃。(即使缓冲区不短,Android 也可能抛出ShortBufferException。我们现在避免了这个问题!) - 升级:Kotlin 1.4.20。
Version 2.9.0¶
2020-10-04
- 修复:写入分段
ByteString的切片时,不会损坏Buffer。我们之前有一个严重的 bug,通过snapshot()和readByteString()创建的ByteString实例错误地根据其完整长度而非切片的长度调整了缓冲区的尺寸。这会导致缓冲区读取崩溃!我们不认为数据被静默损坏了。 - 新增:
CipherSink和CipherSource。将其与javax.crypto.Cipher一起使用来加密和解密数据流。这是一个低级别的加密 API;大多数应用应在可用时使用更高级别的 API,如 TLS。 - 新增:将哈希函数
md5、sha1()、sha512()和sha256()提升到通用 Kotlin。它们目前仅在ByteString上可用,对HashingSource、HashingSink和Buffer的多平台支持将在后续版本中提供。我们在 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。 - 修复:关闭
AsyncTimeoutsources 时强制执行超时。
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,它将不遵循偏移量。 这是因为我们的短路优化省略了必要的偏移参数。 - 新增:在
HashingSource、HashingSink、ByteString和Buffer中支持 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()方法以保持对称。 - 新增:
HashingSource和HashingSink。这些类相当于 JDK 的DigestInputStream和DigestOutputStream。它们提供了方便的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接口。比较按无符号字节排序:ff在00之后排序。
版本 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
- 新增:在
BufferedSource和BufferedSink中读写有符号十进制和无符号十六进制值。与替代方法不同,这些方法不进行任何内存分配! - 新增: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 导入。