成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

IO之ByteArrayInputStream源碼分析

hosition / 2489人閱讀

摘要:主要實現(xiàn)是通過改變屬性的值來實現(xiàn)的這兩個方法是對數(shù)據(jù)做標(biāo)記,然后通過方法重置,主要為了方便重復(fù)讀取流的數(shù)據(jù)以上就是的核心實現(xiàn),其實可以看到關(guān)鍵的方法都是的,說明流都是阻塞的。

分析開始

ByteArrayInputStream一共有四個屬性

    protected byte buf[];//存放數(shù)據(jù)
    protected int pos;//讀取數(shù)據(jù)的偏移量
    protected int mark = 0;//對讀取數(shù)據(jù)做一個標(biāo)記
    protected int count;//count=buf.length 數(shù)據(jù)量的大小

read()方法主要是先判斷數(shù)據(jù)是否讀完,如果讀完則返回-1(所以數(shù)據(jù)讀完了我們會經(jīng)常用read()==-1來判斷),如果沒有讀完則讀取pos的數(shù)據(jù)然后將pos加1,那么下次則讀取的數(shù)據(jù)是pos則是1,接著是一個 & 0xff的操作,這個其實是將byte數(shù)據(jù)轉(zhuǎn)換成int數(shù)據(jù),是通過位運(yùn)算高位補(bǔ)0,例如byte的值是5,那么byte的二進(jìn)制是0000 0101,那么& 0xff的操作是 0000 0101 & 1111 1111 1111 1111 1111 1111 1111 1111 = 0000 0000 0000 0000 0000 0000 0000 0101,結(jié)果沒變只不過是把byte類型轉(zhuǎn)換成int類型了。說明下java里,一個byte是占1個字節(jié)(8位),一個int是4個字節(jié)(32位)

  public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
  }

還有read()的方法,這個方法主要是將數(shù)據(jù)讀到第一個參數(shù)的byte[]里去,與上面read()的差別是這個是有點像是一下讀去一塊數(shù)據(jù),所以效率會比上面一個塊,第二的參數(shù)off是從哪個位置開始讀,len是讀取的需要讀取的長度是多少,讀完后會將pos的位置加上len的數(shù)值算出數(shù)據(jù)的讀取的偏移的位置

    public synchronized int read(byte b[], int off, int len) {
        if (b == null) {
            throw new NullPointerException();
        } else if (off < 0 || len < 0 || len > b.length - off) {
        //裝數(shù)據(jù)byte[]的長度一定要小于,讀取的長度-off的長度,否則就裝不下啦
            throw new IndexOutOfBoundsException();
        }
        if (pos >= count) {
            return -1;
        }
        int avail = count - pos;//計算剩余的有效數(shù)據(jù)
        if (len > avail) {
            len = avail;
        }
        if (len <= 0) {
            return 0;
        }
        System.arraycopy(buf, pos, b, off, len);//拷貝數(shù)據(jù)到byte[]塊里
        pos += len;//設(shè)置讀取的偏移量
        return len;
    }

skip()這個方法是跳過不需要讀取的數(shù)據(jù),然后直接讀取想要的數(shù)據(jù)。主要實現(xiàn)是通過改變屬性pos的值來實現(xiàn)的

    public synchronized long skip(long n) {
        long k = count - pos;
        if (n < k) {
            k = n < 0 ? 0 : n;
        }

        pos += k;
        return k;
    }

mark(),rest()這兩個方法是mark()對數(shù)據(jù)做標(biāo)記,然后通過reset()方法重置,主要為了方便重復(fù)讀取流的數(shù)據(jù)

    public void mark(int readAheadLimit) {
        mark = pos;
    }
    public synchronized void reset() {
        pos = mark;
    }

以上就是ByteArrayInputStream的核心實現(xiàn),其實可以看到關(guān)鍵的方法都是synchronized的,說明io流都是阻塞的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68820.html

相關(guān)文章

  • JAVA IO源碼學(xué)習(xí)系列一(ByteArrayInputStream

    摘要:簡介字節(jié)數(shù)組輸入流上一篇簡單的介紹了一下字節(jié)輸入流的超類,只提及了一下超類中定義的一些方法字節(jié)數(shù)組輸入流是超類的一個具體的實現(xiàn)主要的操作實際上就是讀取操作一個字節(jié)數(shù)組,類中定義了一個緩沖的字節(jié)數(shù)組,具體的操作通過定義一下標(biāo)志位,操作次數(shù)等進(jìn) 簡介 ByteArrayInputStream 字節(jié)數(shù)組輸入流 上一篇簡單的介紹了一下字節(jié)輸入流的超類,只提及了一下超類中定義的一些方法;字節(jié)數(shù)組...

    Keven 評論0 收藏0
  • RedisSerializerJdkSerializationRedisSerializer分析

    摘要:類圖結(jié)構(gòu)如上,主要流程如下類實現(xiàn)接口類中和接口。對于,通過定義對象并調(diào)用方法對進(jìn)行反序列化。底層還是通過調(diào)用的操作和類實現(xiàn)的序列化和反序列化。 showImg(https://segmentfault.com/img/bVJxmP?w=938&h=672); redis在緩存POJO的時候需要將POJO序列化為byte數(shù)組進(jìn)行存儲,spring-data-redis實現(xiàn)了類JdkSer...

    mtunique 評論0 收藏0
  • RedisSerializerJdkSerializationRedisSerializer分析

    摘要:類圖結(jié)構(gòu)如上,主要流程如下類實現(xiàn)接口類中和接口。對于,通過定義對象并調(diào)用方法對進(jìn)行反序列化。底層還是通過調(diào)用的操作和類實現(xiàn)的序列化和反序列化。 showImg(https://segmentfault.com/img/bVJxmP?w=938&h=672); redis在緩存POJO的時候需要將POJO序列化為byte數(shù)組進(jìn)行存儲,spring-data-redis實現(xiàn)了類JdkSer...

    Edison 評論0 收藏0
  • RedisSerializerJdkSerializationRedisSerializer分析

    摘要:類圖結(jié)構(gòu)如上,主要流程如下類實現(xiàn)接口類中和接口。對于,通過定義對象并調(diào)用方法對進(jìn)行反序列化。底層還是通過調(diào)用的操作和類實現(xiàn)的序列化和反序列化。 showImg(https://segmentfault.com/img/bVJxmP?w=938&h=672); redis在緩存POJO的時候需要將POJO序列化為byte數(shù)組進(jìn)行存儲,spring-data-redis實現(xiàn)了類JdkSer...

    paulli3 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<