摘要:簡介字節數組輸入流上一篇簡單的介紹了一下字節輸入流的超類,只提及了一下超類中定義的一些方法字節數組輸入流是超類的一個具體的實現主要的操作實際上就是讀取操作一個字節數組,類中定義了一個緩沖的字節數組,具體的操作通過定義一下標志位,操作次數等進
簡介 ByteArrayInputStream 字節數組輸入流
上一篇簡單的介紹了一下字節輸入流的超類,只提及了一下超類中定義的一些方法;字節數組輸入流是超類的一個具體的實現:主要的操作實際上就是讀取操作一個字節數組,類中定義了一個緩沖的字節數組,具體的操作通過定義一下標志位,操作次數等進行讀取該字節數組中的內容;
1.主要方法源碼介紹1.介紹過程依據第一篇中的描述的過程;
(1)首先介紹類中的屬性內容:
//存放字節流數組,實際的操作的數據內容 protected byte buf[]; //當前讀取的位置,在相關操作中會修改這個讀取位置 protected int pos; //標記讀取的位置,如果有需要標記,可以使用mark()方法標記位置 protected int mark = 0; //字節流數組大小 protected int count;
(2)然后是定義構造字節數組內容:該類提供了兩種方式的構造函數;第一種直接指定字節數組輸入流中緩沖的流數組,(這樣后續的讀取等操作都是在處理這個數組中的數據),該構造函數中設置了上面提到的相關屬性;
第二種則指定了具體位置和大小,但實際的數據已全部在緩沖的數組中,只是確實了讀取的位置和大小,所以可以讀取的內容比實際的內容少;
public ByteArrayInputStream(byte buf[]) { this.buf = buf; this.pos = 0; this.count = buf.length; } public ByteArrayInputStream(byte buf[], int offset, int length) { this.buf = buf; this.pos = offset; this.count = Math.min(offset + length, buf.length); this.mark = offset; }
(3)判斷是否還能讀?。焊鶕斍白x取的位置來確定是否還有數據
public synchronized int available() { return count - pos; }
(4)具體的讀取數據:讀取操作及先判斷滿足讀取條件后讀取一個緩沖數組中的數據,并將讀取位置+1,&0xff的意義在于保證數據操作的一致性(計算機存儲數據機制方面)
public synchronized int read() { return (pos < count) ? (buf[pos++] & 0xff) : -1; }
讀取數據到指定的字節數組中,可以指定讀取的位置和大小
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) { 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); pos += len; return len; }
(5)操作完記得關閉close();
2.其他方法簡介:1.skip()跳過,忽略:及修改讀取位置
public synchronized long skip(long n) { long k = count - pos; if (n < k) { k = n < 0 ? 0 : n; } pos += k; return k; }
2.mark():標記位置,操作過程中標記需要的位置,這樣在后面可以通過reset()方法將讀取位置修改到這個值,這樣就可以再此從此位置讀取數據;
public void mark(int readAheadLimit) { mark = pos; }
3.reset():上面介紹過了,
public synchronized void reset() { pos = mark; }3.差不多就介紹完了,附上自己重寫的代碼
/** 1. 數組字節輸入流 */ public class MyByteArrayInputStream { //存放字節流數組 protected byte buffer[]; //當前讀取的位置 protected int position; //字節流數組大小 protected int counts; //標記讀取的位置 protected int mark; /** * 指定字節數組構造輸入流 * @param buf 指定數組 */ public MyByteArrayInputStream(byte[] buf) { this.buffer = buf; this.counts = buf.length; } public MyByteArrayInputStream(byte[] buf,int offset,int length) { this.position = offset; this.mark = offset; this.buffer = buf; this.counts = Math.min(buf.length, length+offset); } //讀取字節數組中的字節流 public synchronized int read(){ return positioncounts){ return -1; } // int can = counts - position; if(length > can){ length = can; } if(length <=0){ return 0; } System.arraycopy(buffer, position, buf, offset, length); position += length; return length; } //跳過字節數組中的n個字節 public synchronized long skip(long n){ //當前可讀取的數量 long can = counts-position; //當跳過的大小小于可讀取的數量時 if(n < can){ //值大于0 設置跳過的次數為 n ,否則為0; can = n < 0 ? 0 : n; } //設置當前讀取的位置,跳過n個 position +=can; //返回實際跳過的值 return can; } //是否支持標記,支持 public boolean markSupported(){ return true; } //標記當前讀取的位置,與重置相對,標記之后,使用重置方法可以在指定位置讀取 public void mark(){ mark = position; } //設置當前讀取的位置為上一次標記的位置 public synchronized void reset(){ position = mark; } //剩余可以去到的數量 public synchronized int available(){ return counts-position; } //關閉操作 public void close() throws IOException { } }
## 4. 最后召喚神獸##
/** * ___====-_ _-====___ * _--^^^#####// #####^^^--_ * _-^##########// ( ) ##########^-_ * -############// |^^/| ############- * _/############// (@::@) ############\_ * /#############(( // ))############# * -############### (oo) //###############- * -################# / VV //#################- * -###################/ //###################- * _#/|##########/######( / )######/##########|#_ * |/ |#/#/#// #/## | | /##/#/ /#/#/#| | * ` |/ V V ` V #| | | |/#/ V " V V | " * ` ` ` ` / | | | | " " " " * ( | | | | ) * __ | | | | /__ * (vvv(VVV)(VVV)vvv) * 神獸保佑 * 代碼無BUG! */
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68008.html
摘要:主要實現是通過改變屬性的值來實現的這兩個方法是對數據做標記,然后通過方法重置,主要為了方便重復讀取流的數據以上就是的核心實現,其實可以看到關鍵的方法都是的,說明流都是阻塞的。 分析開始 ByteArrayInputStream一共有四個屬性 protected byte buf[];//存放數據 protected int pos;//讀取數據的偏移量 prot...
摘要:我的是忙碌的一年,從年初備戰實習春招,年三十都在死磕源碼,三月份經歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉正。 我的2017是忙碌的一年,從年初備戰實習春招,年三十都在死磕JDK源碼,三月份經歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:此類中的方法在關閉此流后仍可被調用,而不會產生任何。主要的功能是從緩沖區讀取字節構造函數創建一個,使用作為其緩沖區數組。緩沖區會隨著數據的不斷寫入而自動增長。 內存操作流 之前的所有的流操作都是針對文件的,但是有時候只是想要實現數據間轉換,此時如果我們想要創建一個文件然后再刪除文件,那樣顯得有點麻煩,因此此時的內存操作流就顯得很適合這類的操作,因為它只是在內存中存儲,并不會真正的創建文...
摘要:該篇主要以代碼示例為主,因為上不去,看不到這個官方文檔和。因為接下來的底層默認使用的就是。和功能是一致的。區別是不會拋出異常,而會拋出異常。而解析輸入的文本內容依據默認的解析文本的模式。 Json-smart 該篇主要以代碼示例為主,因為google上不去,看不到Json-smart這個官方文檔和API。故只例舉一些代碼示例。因為接下來的Json-path底層默認使用的就是JsonSm...
閱讀 1991·2021-09-22 16:05
閱讀 9255·2021-09-22 15:03
閱讀 2880·2019-08-30 15:53
閱讀 1698·2019-08-29 11:15
閱讀 903·2019-08-26 13:52
閱讀 2348·2019-08-26 11:32
閱讀 1798·2019-08-26 10:38
閱讀 2562·2019-08-23 17:19