OKIO

作者: 逍遥的魂儿假不正经吧 | 来源:发表于2017-03-07 16:47 被阅读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这样的库,确实能为开发带来许多方便。

    相关文章

      网友评论

        本文标题:OKIO

        本文链接:https://www.haomeiwen.com/subject/mvwmgttx.html