andorid jar/庫源碼解析之okio

目錄:andorid jar/庫源碼解析 html

Okio:

  做用:

    說白了,就是一個IO庫,基於java原生io。來進行操做,內部作了優化,簡潔,高效。因此受到了一部分人的喜歡和使用java

  栗子:

  讀寫文件。git

    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);

  一、定義文件,github

  二、傳入文件,sink內部,建立一個文件寫入流  new FileOutputStream(file)的優化

  三、傳遞流對象給Okio的sink方法。返回一個Sink 的接口的匿名對象,對象中提供的方法,能夠訪問到傳入的流,對流進行操做。(write,flush,close)this

BufferedSink bSink = Okio.buffer(sink);
bSink.writeUtf8("testtest");

  一、構造一個 RealBufferedSink 對象,並傳入接口Sink的接口對象。spa

  二、調用 RealBufferedSink 對象的,write方法,寫數據。code

  三、在RealBufferedSink對象內部,維護有一個 okio.Buffer 對象,寫入方法,首先寫入Buffer內部。而後調用 sink的write方法進行寫入到流中。htm

  四、這裏的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());

  一、傳入文件流,返回一個 Source接口對象,接口方法中使用了 傳入的流進行操做。(read,close)

  二、構造一個Buffer對象。用於對Source接口對象,進行操做,Buffer中包含更多方法。

  三、調用 source的read方法,先建立一個數據段(Segment),而後從流中讀取數據,寫入到數據段中。

  四、readUtf8,從數據段中讀取數據,這裏涉及到了一個判斷,(根據當前數據讀取位置和須要讀取的數據的長度,進行斷定,若是當前數據段已經讀完,就須要釋放下一個數據段,供下次讀取。

  源碼:https://github.com/square/okio

  引入:

implementation 'com.squareup.okio:okio:1.9.0'
相關文章
相關標籤/搜索