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失效的时间的策略。维护着TimeoutsDeadlines两个属性。
  • AsyncTimeout:TimeOut的实现类,为Sink和Source提供了超时的策略。AsyncTimeout的实现原理:AsyncTimeout相当于一个节点,每个节点都带有tiemout信息,程序维护一条由AsyncTimeout节点组成优先队列链表(剩余超时时间越小的排越前),然后通过后台的一个守护线程,不断的去轮询这条链表,如果对应节点超时就调用Interrupted进行中断,否则调用wait进行等待。

results matching ""

    No results matching ""