欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

andorid jar/库源码解析之okio

程序员文章站 2022-04-13 09:19:29
目录:andorid jar/库源码解析 Okio: 作用: 说白了,就是一个IO库,基于java原生io。来进行操作,内部做了优化,简洁,高效。所以受到了一部分人的喜欢和使用 栗子: 读写文件。 private void ReadFile() { try { InputStream in = ne ......

目录:andorid jar/库源码解析 

okio:

  作用:

    说白了,就是一个io库,基于java原生io。来进行操作,内部做了优化,简洁,高效。所以受到了一部分人的喜欢和使用

  栗子:

  读写文件。

    private void readfile() {
        try {
            inputstream in = new fileinputstream(new file("/sdcard/a.txt")); // new bytearrayinputstream(("adasfdsaf").getbytes());

            //2.缓冲源
            source source = okio.source(in);
            //3.buffer
            buffer sink = new buffer();
            source.read(sink, in.read());
            //4.将数据读入buffer
            system.out.print(sink.readutf8());
        }catch (exception e){
            system.out.print("error " + e.getmessage());
            e.printstacktrace();
        }
    }

    private void writefile(){
        bufferedsink bsink = null;
        try {
            boolean iscreate = false;
            file file = new file("/sdcard/a.txt");
            if (!file.exists()) {
                iscreate = file.createnewfile();
            } else {
                iscreate = true;
            }

            //写入操作
            if (iscreate) {
                sink sink = okio.sink(file);
                bsink = okio.buffer(sink);
                bsink.writeutf8("1");
                bsink.writeutf8("\n");
                bsink.writeutf8("this is new file!");
                bsink.writeutf8("\n");
                bsink.writestring("我是每二条", charset.forname("utf-8"));
                bsink.flush();
            }

            system.out.print("success");
        }catch (exception e){
            e.printstacktrace();
            system.out.print("error " + e.getmessage());
        }finally {
            try {
                if (null != bsink) {
                    bsink.close();
                }
            }catch (ioexception e){
                e.printstacktrace();
            }
        }
    }

  源码解读:

file file = new file("/sdcard/a.txt");
sink sink = okio.sink(file);

  1、定义文件,

  2、传入文件,sink内部,创建一个文件写入流  new fileoutputstream(file)的

  3、传递流对象给okio的sink方法。返回一个sink 的接口的匿名对象,对象中提供的方法,可以访问到传入的流,对流进行操作。(write,flush,close)

bufferedsink bsink = okio.buffer(sink);
bsink.writeutf8("testtest");

  1、构造一个 realbufferedsink 对象,并传入接口sink的接口对象。

  2、调用 realbufferedsink 对象的,write方法,写数据。

  3、在realbufferedsink对象内部,维护有一个 okio.buffer 对象,写入方法,首先写入buffer内部。然后调用 sink的write方法进行写入到流中。

  4、这里的okio.buffer,用于高效复制的时候使用。


inputstream in = new fileinputstream(new file("/sdcard/a.txt")); 
//2.缓冲源
source source = okio.source(in);
//3.buffer
buffer sink = new buffer();
source.read(sink, in.read());
//4.将数据读入buffer
system.out.print(sink.readutf8());

  1、传入文件流,返回一个 source接口对象,接口方法中使用了 传入的流进行操作。(read,close)

  2、构造一个buffer对象。用于对source接口对象,进行操作,buffer中包含更多方法。

  3、调用 source的read方法,先创建一个数据段(segment),然后从流中读取数据,写入到数据段中。

  4、readutf8,从数据段中读取数据,这里涉及到了一个判断,(根据当前数据读取位置和需要读取的数据的长度,进行判定,如果当前数据段已经读完,就需要释放下一个数据段,供下次读取。

  源码:

  引入:

implementation 'com.squareup.okio:okio:1.9.0'