摘要:主要實現是通過改變屬性的值來實現的這兩個方法是對數據做標記,然后通過方法重置,主要為了方便重復讀取流的數據以上就是的核心實現,其實可以看到關鍵的方法都是的,說明流都是阻塞的。
分析開始
ByteArrayInputStream一共有四個屬性
protected byte buf[];//存放數據 protected int pos;//讀取數據的偏移量 protected int mark = 0;//對讀取數據做一個標記 protected int count;//count=buf.length 數據量的大小
read()方法主要是先判斷數據是否讀完,如果讀完則返回-1(所以數據讀完了我們會經常用read()==-1來判斷),如果沒有讀完則讀取pos的數據然后將pos加1,那么下次則讀取的數據是pos則是1,接著是一個 & 0xff的操作,這個其實是將byte數據轉換成int數據,是通過位運算高位補0,例如byte的值是5,那么byte的二進制是0000 0101,那么& 0xff的操作是 0000 0101 & 1111 1111 1111 1111 1111 1111 1111 1111 = 0000 0000 0000 0000 0000 0000 0000 0101,結果沒變只不過是把byte類型轉換成int類型了。說明下java里,一個byte是占1個字節(8位),一個int是4個字節(32位)
public synchronized int read() { return (pos < count) ? (buf[pos++] & 0xff) : -1; }
還有read()的方法,這個方法主要是將數據讀到第一個參數的byte[]里去,與上面read()的差別是這個是有點像是一下讀去一塊數據,所以效率會比上面一個塊,第二的參數off是從哪個位置開始讀,len是讀取的需要讀取的長度是多少,讀完后會將pos的位置加上len的數值算出數據的讀取的偏移的位置
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) { //裝數據byte[]的長度一定要小于,讀取的長度-off的長度,否則就裝不下啦 throw new IndexOutOfBoundsException(); } if (pos >= count) { return -1; } int avail = count - pos;//計算剩余的有效數據 if (len > avail) { len = avail; } if (len <= 0) { return 0; } System.arraycopy(buf, pos, b, off, len);//拷貝數據到byte[]塊里 pos += len;//設置讀取的偏移量 return len; }
skip()這個方法是跳過不需要讀取的數據,然后直接讀取想要的數據。主要實現是通過改變屬性pos的值來實現的
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()對數據做標記,然后通過reset()方法重置,主要為了方便重復讀取流的數據
public void mark(int readAheadLimit) { mark = pos; } public synchronized void reset() { pos = mark; }
以上就是ByteArrayInputStream的核心實現,其實可以看到關鍵的方法都是synchronized的,說明io流都是阻塞的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68820.html
摘要:簡介字節數組輸入流上一篇簡單的介紹了一下字節輸入流的超類,只提及了一下超類中定義的一些方法字節數組輸入流是超類的一個具體的實現主要的操作實際上就是讀取操作一個字節數組,類中定義了一個緩沖的字節數組,具體的操作通過定義一下標志位,操作次數等進 簡介 ByteArrayInputStream 字節數組輸入流 上一篇簡單的介紹了一下字節輸入流的超類,只提及了一下超類中定義的一些方法;字節數組...
摘要:類圖結構如上,主要流程如下類實現接口類中和接口。對于,通過定義對象并調用方法對進行反序列化。底層還是通過調用的操作和類實現的序列化和反序列化。 showImg(https://segmentfault.com/img/bVJxmP?w=938&h=672); redis在緩存POJO的時候需要將POJO序列化為byte數組進行存儲,spring-data-redis實現了類JdkSer...
摘要:類圖結構如上,主要流程如下類實現接口類中和接口。對于,通過定義對象并調用方法對進行反序列化。底層還是通過調用的操作和類實現的序列化和反序列化。 showImg(https://segmentfault.com/img/bVJxmP?w=938&h=672); redis在緩存POJO的時候需要將POJO序列化為byte數組進行存儲,spring-data-redis實現了類JdkSer...
摘要:類圖結構如上,主要流程如下類實現接口類中和接口。對于,通過定義對象并調用方法對進行反序列化。底層還是通過調用的操作和類實現的序列化和反序列化。 showImg(https://segmentfault.com/img/bVJxmP?w=938&h=672); redis在緩存POJO的時候需要將POJO序列化為byte數組進行存儲,spring-data-redis實現了類JdkSer...
閱讀 940·2021-09-27 13:36
閱讀 888·2021-09-08 09:35
閱讀 1064·2021-08-12 13:25
閱讀 1437·2019-08-29 16:52
閱讀 2907·2019-08-29 15:12
閱讀 2726·2019-08-29 14:17
閱讀 2606·2019-08-26 13:57
閱讀 1012·2019-08-26 13:51