[六]JavaIO之 ByteArrayInputStream與ByteArrayOutputStream
阿新 • • 發佈:2018-12-09
功能簡介
ByteArrayInputStream 和 ByteArrayOutputStream 提供了針對於字元陣列 byte [] 的標準的IO操作方式 ByteArrayInputStream將會給一個byte buf[] 提供標準的IO操作方式 ByteArrayOutputStream則是將資料寫入到內部的位元組陣列中ByteArrayInputStream 詳解
功能: 從提供的位元組陣列中,以IO的行為方式工作,進行讀取資料ByteArrayInputStream欄位
protected byte[] buf
|
用於儲存由該流的建立者提供的 byte 陣列 也就是構造方法傳入 |
protected int count | 個數 |
protected int mark | 流中當前的標記位置 構造時預設將 ByteArrayInputStream 物件標記在位置零處 通過 mark() 方法可將其標記在緩衝區內的另一個位置處 通過 reset() 方法將當前緩衝區位置設定為此點 protected int mark = 0;定義時設定了預設值,如果不設定將為0 |
protected int pos | 要從輸入流緩衝區中讀取的下一個字元的索引 |
ByteArrayInputStream構造方法
read方法
帶引數的read()方法 將資料讀取到b的off位置處 //從流中讀取資料到b[] 中,從off開始寫,寫len長度 public synchronized int read(byte b[], int off, int len) { if (b == null) {//如果b為null 空指標 throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) {//如果偏移量小於0 或者寫入長度小於0 或者想要讀取的長度小於實際的長度了 throw new IndexOutOfBoundsException(); } if (pos >= count) {//如果位置游標已經到了最後了,沒有資料可讀,返回-1 return -1; } int avail = count - pos;//可用個數為總個數count - 當前位置pos if (len > avail) {//如果想要讀取的len比實際擁有的資料要長,那麼只讀取實際的個數 len = avail; } if (len <= 0) { return 0; } System.arraycopy(buf, pos, b, off, len);//使用本地方法拷貝資料 buf 的pos位置開始拷貝,拷貝len個,到b的off位置 pos += len;//位置游標後移 return len; } |
skip
available
本質就是個陣列,所以可用個數就是總個數減去下一個字元的索引 |
mark /markSupported /reset
close
ByteArrayInputStream的根本在於針對給定的某個位元組陣列,提供IO操作方式的統一形式 就好像你寫了個方法操作位元組陣列一樣,完全不涉及資源 所以無需關閉任何實質內容 |
通過close關閉ByteArrayInputStream之後,如果再次使用這個流 並不會丟擲異常 當然,流結束了,就不能再繼續使用了 |
ByteArrayOutputStream詳解
以IO的行為方式工作,將資料寫入到內部的位元組陣列中ByteArrayOutputStream欄位
protected byte buf[]; |
儲存資料的緩衝區 |
protected int count; |
緩衝區中的有效位元組數,每次寫入將會寫入到buf[count]處 |
ByteArrayOutputStream構造方法
構造方法只是設定內部位元組陣列這個緩衝區資料的大小public ByteArrayOutputStream() ; | 預設長度為32位 |
public ByteArrayOutputStream(int size) | 只要引數值合法,建立指定個數的位元組陣列緩衝區 |
write
write是輸出,引數都是他的輸出內容,只是不同的流輸出的目的不一樣,此處我們的輸出流的目的地是內部的位元組陣列write(int) | 將指定的位元組寫入此 byte 陣列輸出流 也就是寫入到內部的位元組陣列中 |
write(byte[], int, int) | 將指定 byte 陣列中從偏移量 off 開始的 len 個位元組寫入此 byte 陣列輸出流 也就是寫入到內部的位元組陣列中 |
writeTo(OutputStream)
因為ByteArrayOutputStream內部維護的是一個位元組陣列,所以可以直接作為OutputStream中write()方法的引數 程式碼很簡單,就是講內部的位元組陣列,轉存到入參指定的輸出流中 相當於把流中的資料重寫了一份到另外的輸出流 |
toString()
計算機所有的資料都是二進位制儲存,最小的單位是位元組,字元的編碼形式也正是位元組 所以,toString其實就是把位元組序列進行解碼 |
int型別入參的方法,在JDK1.8 已經棄用 |
toString()使用平臺預設的字符集,通過解碼位元組將緩衝區內容轉換為字串 toString(String charsetName) 使用指定的 charsetName,通過解碼位元組將緩衝區內容轉換為字串 |
reset()
reset是重置的意思,ByteArrayOutputStream 使用buf[] 儲存資料,使用count指示位置 所以想要重新使用現在的緩衝區,拋棄原來所有的,只需要將count清零,每次的資料重新從0開始寫入位元組陣列即可 |
反正我們知道現在總共有多少有效位元組,原來寫入到buf中的可能多於count的那些位元組就放著好了,我們也不去使用 |
size()
count就是一直用來記錄有效個數的,所以直接返回count就是實際的size |
toByteArray()
轉換為位元組陣列,它本身就是一個位元組陣列 所以轉換比較簡單,只需要建立一個大小相同的位元組陣列,並且將資料拷貝過去即可 |
close()
ByteArrayOutputStream 寫入的是自己內部的位元組陣列 屬於記憶體資料,不涉及任何資源,所以close不需要做什麼 |