变更日志¶
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()
阻止超时触发。 - 重大变更:移除
watchosX86
Kotlin/Native 目标。根据 Kotlin 博客,‘这是针对 Intel Mac 的过时模拟器。请改用 watchosX64 目标。’ - 新增:添加
watchosDeviceArm64
Kotlin/Native 目标。 - 新增:接受
kotlin.time.Duration
的Timeout
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
控制流。 - 修复:对
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。 - 修复:关闭
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,它将不遵循偏移量。 这是因为我们的短路优化省略了必要的偏移参数。 - 新增:在
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 导入。