okio
Okio是 java.io 和 java.nio的补充,使用它更容易访问、存储和处理数据。
Closeable、AutoCloseable、Flushable
- AutoCloseable:1.7加入,表示一种不再使用时需要关闭的资源。
- Closeable:1.7之前是独立的,1.7之后是继承自AutoCloseable,拥有了AutoCloseable的能力。
AutoCloseable的作用在于对JDK7新添加的带资源的try语句提供了支持,这种try语句可以自动执行资源关闭过程。只有实现了AutoCloseable接口的类的对象才可以由带资源的try语句进行管理。具体如下:
public class MyAutoCloseable implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("Close resource!");
}
public void readResource() {
System.out.println("Read resource!");
}
}
@Test
public void testCloseResource() throws Exception {
try(MyAutoCloseable autoCloseable = new MyAutoCloseable()) {
autoCloseable.readResource();
}
}
只有在上面这种try-with-resources
的模式下,才能体现AutoCloseable的优势。
重要的类
- Segment:代表一个数据块,由一个byte数组(8192)构成的;
- SegmentPool:Segment池,以单链表的形式维护,负责Segment的回收和闲置Segment的管理,一般Segment都是从该池获取的。该池是线程安全的;
- Sink:对应着java io里的
OutputStream
; - BufferedSink:继承Sink,主要是定义了Output的一系列操作;
- RealBufferedSink:继承自BufferedSink,是具体的实现类;
- Source:对应着java io里的InputStream;
- BufferedSource:继承Source,主要是定义了input的一系列操作;
- RealBufferedSource:BufferedSource,是具体的实现类;
- Buffer:实际的RealBufferedSink和RealBufferedSource的操作者。充当Sink、Source、InputStream和OutputStream间的高效缓存区,由于Buffer实现了BufferedSource和BufferedSink这两个接口,所以可以很方便的对其进行IO操作。
- ByteString:是一个固定大小的byte序列(由一个byte数组构成)。解决了byte和String之间转换的问题。
- TimeOut:一个task失效的时间的策略。维护着
Timeouts
和Deadlines
两个属性。 - AsyncTimeout:TimeOut的实现类,为Sink和Source提供了超时的策略。AsyncTimeout的实现原理:AsyncTimeout相当于一个节点,每个节点都带有tiemout信息,程序维护一条由AsyncTimeout节点组成优先队列链表(剩余超时时间越小的排越前),然后通过后台的一个守护线程,不断的去轮询这条链表,如果对应节点超时就调用Interrupted进行中断,否则调用wait进行等待。