Okio简介

一、简介

是由square公司开发的用于IO读取。补充了Java.io和java.nio的不足,以便能够更加方便,快速的访问、存储和处理数据。内部的读写操作是在内存中进行的。

二、使用

Okio的使用非常方便,相比java.io库它简化了很多繁杂的东西。这其中最核心的两个类:
Sink与Source代表的分别就是传统的输出流与输入流。

1、写数据到文件

private void writeFile() {
    File dir = new File(ROOT);
    File file = new File(dir,"Okio.txt");
    //文件是否存在,不存在就创建
    if(!file.exists()){
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try{
        //获取sink对象
        Sink write = Okio.sink(file);
        //获取sink缓冲对象
        BufferedSink bufferedSink = Okio.buffer(write);
        //写入数据
        bufferedSink.writeUtf8("你好!\r\n");
        bufferedSink.writeUtf8("Hello Word\r\n");
        //关闭sink
        bufferedSink.close();
        writeSink.close();
    }catch (Exception e){
        e.printStackTrace();
    }
}

2、从文件读取数据

private void readFile() {
    File file = new File(ROOT,"Okio.txt");
    //文件是否存在
    if(!file.exists()){
        return;
    }
    try{
        //获取source对象
        Source read = Okio.source(file);
        BufferedSource bufferedSource = Okio.buffer(read);
        String result = null;
        //循环读取数据
        while ((result = bufferedSource.readUtf8Line()) != null){
            System.out.println("=====result=====" + result);
        }
        //关闭source
        bufferedSource.close();
        read.close();
    }catch (Exception e){
        e.printStackTrace();
    }
}

三、原理解析

Sink
它有一子类接口 BufferedSink,BufferedSink的实现类为RealBufferedSink。

Source
它有一子类接口 BufferedSource。 BufferedSource的实现类为RealBufferedSource。

RealBufferedSink和RealBufferedSource内部都创建了一个Buffer变量

final class RealBufferedSource implements BufferedSource {
  public final Buffer buffer = new Buffer();
  public final Source source;
  boolean closed;
  .......
}


final class RealBufferedSink implements BufferedSink {
 public final Buffer buffer = new Buffer();
 public final Sink sink;
 boolean closed;
 ......
}

读写的操作实质就是调用的buffer的读写方法去实现的。比如RealBufferedSink中的写操作

@Override public BufferedSink writeUtf8(String string) throws IOException {
    if (closed) throw new IllegalStateException("closed");
    buffer.writeUtf8(string);
    return emitCompleteSegments();
}

Buffer是BufferedSink和BufferedSource的实现类,作为缓冲区,因此它既可以用来读数据,也可以用来写数据,其内部使用了一个Segment和SegmentPool,维持着一个链表来存取数据

你可能感兴趣的:(Android)