一、简介
是由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");//关闭sinkbufferedSink.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);}//关闭sourcebufferedSource.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,维持着一个链表来存取数据