概述
Okio是一个用来补充 java.io
and java.nio
的库,它使访问、存储以及处理数据更加方便。
ByteStrings 和 Buffers
Okio围绕两种类型构建,它们封装了大量功能并提供了简单的API:
ByteString是一个不变的字节序列。对于字符数据,
String
是最基础的。ByteString
可以看做是Sring长期失散的兄弟,它将String中的字符数据以二进制数据形式看待。这个类知道如何以十六进制、base64、utf-8编码和解码自身。Buffer 是一个可变的字节序列。有点像
ArrayList
,你不需要去关心buffer大小。以队列形式读写缓存:写数据到队列末尾,从队列头读取数据。这里无需管理位置、限制和容量。
内部来讲, ByteString
和Buffer
用了一些小技巧来节省CPU和内存,如果你以ByteString
形式编码一个UTF-8的字符串,它会缓存一个字符串引用,这样在后面解码时就不需要做任何事。
Buffer
用片段的链表来实现。当在缓存间移动数据时,无需拷贝数据,只需设置片段的相关值。这种方式对多线程编程非常有帮助:网络线程能够和工作线程交换数据而无需任何内存拷贝。
Sources 和 Sinks
java.io
设计中优雅的部分是如何将转换进行分层,就像加密和压缩。Okio包含它自己的流类型称为Source
和 Sink
,类似于InputStream
和 OutputStream
,但是有一些关键不一样:
超时. 流提供了访问潜在的I/O超时机制。不像
java.io
socket流,read()
和write()
只是名义上的超时。The streams provide access to the timeouts of the underlying
I/O mechanism. Unlike thejava.io
socket streams, bothread()
andwrite()
calls honor timeouts.易于实现.
Source
定义了三个方法:read()
,close()
和timeout()
。它没有像available()
一样的危险因素或单个字节读写导致正确性和性能的问题。易于使用. 尽管
Source
和Sink
的 实现 只有三种方法去写,但是 调用者 有一堆丰富的BufferedSource
和BufferedSink
的API接口。这些接口在某些方面能实现任何你想要的。没有字节流和字符流之间的区别. 都以数据形式看待。读和写都以字节、UTF-8字符串、大端32位整数,小段short。不再需要
InputStreamReader
!易于测试.
Buffer
类同时实现了BufferedSource
和BufferedSink
,因此测试代码简单明了。
Sources 和 sinks 能够与InputStream
和 OutputStream
进行互操作。你能够将任何 Source
看做是InputStream
,同时也能够将任何InputStream
看做是Source
。Sink
和 OutputStream
也是一样。
示例:一个PNG解码器
下面是用Okio来解码PNG文件的示例:
|
|