技术成长之路

OKIO

2017-03-07  本文已影响0人  逍遥的魂儿假不正经吧

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这样的库,确实能为开发带来许多方便。

上一篇下一篇

猜你喜欢

热点阅读