OKIO
OKIO:Okio库是一个由square公司开发的,它补充了Java.io和java.nio的不足,以便能够更加方便,快速的访问、存储和处理你的数据。而OkHttp的底层也使用该库作为支持。而在开发中,使用该库可以大大给你带来方便。:
使用:
compile 'com.squareup.okio:okio:1.7.0'
Okio的简单使用,无非下面几个步骤:
a.构建缓冲池、缓冲源对象
b.读、写
c.关闭缓冲对象;
简单的举几个例子:
1.读写:
public void readWriteFile(View view) {
try{
File file =newFile(getApplicationContext().getFilesDir().getPath().toString() +"/readWriteFile");
if(!file.exists()) {
file.createNewFile();
}
BufferedSink sink = Okio.buffer(Okio.sink(file));
sink.writeUtf8("hello ,OKIO file");
sink.close();
BufferedSource source = Okio.buffer(Okio.source(file));
Log.e(TAG,"readWriteFile: "+ source.readUtf8());
source.close();
}catch(Exception e) {
e.printStackTrace();
}
}
2.追写文件:
public void appendFile(View view) {
try{
File file =newFile(getApplicationContext().getFilesDir().getPath().toString() +"/appendFile");
if(!file.exists()) {
file.createNewFile();
}
BufferedSink sink = Okio.buffer(Okio.appendingSink(file));
sink.writeUtf8("Helllo,");
sink.close();
sink = Okio.buffer(Okio.appendingSink(file));
sink.writeUtf8(" java.io file");
sink.close();
BufferedSource source = Okio.buffer(Okio.source(file));
Log.e(TAG,"readWriteFile: "+ source.readUtf8());
source.close();
}catch(Exception e) {
e.printStackTrace();
}
}
3.读流:
public void sinkFromOutputStream(View view)throwsException {
try{
Buffer data =newBuffer();
data.writeUtf8("a");
data.writeUtf8("bbbbbbbbb");
data.writeUtf8("c");
ByteArrayOutputStream out =newByteArrayOutputStream();
Sink sink = Okio.sink(out);
sink.write(data,3);
Log.e(TAG,"sinkFromOutputStream: "+ data.readUtf8());
}catch(Exception e) {
e.printStackTrace();
}
}
从上面几个例子,可以看出来,Okio中关键的两个接口:Sink和Source,这两个接口都继承了Closeable接口;而Sink可以简单的看做OutputStream,Source可以简单的看做InputStream。而这两个接口都是支持读写超时设置的。结构如下:
Okio结构它们各自有一个支持缓冲区的子类接口,BufferedSink和BufferedSource,而BufferedSink有一个实现类RealBufferedSink,BufferedSource有一个实现类RealBufferedSource;此外,Sink和Source它门还各自有一个支持gzip压缩的实现类GzipSink和GzipSource;一个具有委托功能的抽象类ForwardingSink和ForwardingSource;还有一个实现类便是InflaterSource和DeflaterSink,这两个类主要用于压缩,为GzipSink和GzipSource服务。
sink和source的实现类那么,Okio的高效是怎么实现的呢。
所有的写数据操作,其实是:先保存在Segment中,由Buffer对象来直接操作它,最后真正写的时候,由Sink的实现来完成。代码比较多,有兴趣的可以自己去看看Buffer类及其里面的writeUtf8方法和双向链表的Segment类。
Okio只暴露了几个类,其中Buffer类实现了BufferedSink和BufferedSource,支持着缓冲区,可读可写,其内部使用了一个Segment和SegmentPool,维持着一个链表,其循环利用的机制和Android中Message的利用机制是一模一样的。
另外还有Gzip这样压缩解压缩的类,ByteString这样能将String做各种变化的类,并且还提供加密方法。
Okio这样的库,确实能为开发带来许多方便。