Java IO | InputStream與OutputStream 簡介(六)

InputStream 和 OutputStream 對於字節流的輸入和輸出, 是做爲協議的存在。 因此有必要了解下這兩個類提供出來的基本約定。 這兩個類是抽象類,並且基本上沒什麼實現,都是依賴於子類具體的去實現, 可是他是對於其子類協議綱領通常的存在。 瞭解清楚每個方法含義,對於後續具體的子類將會有很是大的幫助。  1 

基本含義

InputStream 全部字節輸入流的超類
是一個抽象類
OutputStream 全部字節輸出流的超類
他是一個抽象類

 2 

方法列表

圖片
  • InputStream  包含了讀取方法以及輔助方法;數組

  • OutputStream包含了寫入方法以及輔助方法;app


 3 ide

方法對照


 4 測試

方法詳解

 read read()  從輸入流中讀取數據的下一個字節。 返回 0 到 255 範圍內的 int 字節值,若是由於已經到達流末尾而沒有可用的字節,返回值 -1。 方法將會一直阻塞,直到數據可用,檢測到流的末尾或者拋出異常
無參數的read() 是抽象方法,由實現類提供實現, 三個read方法實際上根本方法都是read()方法, 其餘兩個方法爲拓展功能邏輯的便捷方法。
無參數的read()返回的數據爲讀取到的字節值, 而有參數的則是讀取到字節數組中,因此返回值爲讀取到的個數
read方法關鍵點:
要麼就是直接返回讀取的字節;
要麼就是將讀取到的字節放入字節數組中,字節數組是你傳遞進去的;
write write(int b) 將指定的字節寫入此輸出流
write 的常規協定是:向輸出流寫入一個字節, 要寫入的字節是參數 b 的八個低位   b 的 24 個高位將被忽略 
說白了就是寫入的是byte雖然參數是int

write(byte[] b) 將 b.length 個字節從指定的 byte 數組寫入此輸出流 write(b) 的常規協定是:應該與調用 write(b, 0, b.length) 的效果徹底相同
write(byte[] b,int off,int len) 將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此輸出流 write(b, off, len) 的常規協定是:將數組 b 中的某些字節按順序寫入輸出流; 元素 b[off] 是此操做寫入的第一個字節,b[off+len-1] 是此操做寫入的最後一個字節
相似read的調用形式, 直接寫入指定字節的write(int b)  方法是根本, 其餘的是拓展功能
read()  與write(int b) 是根本的讀取一個字節或者寫入一個字節的方法。
其他形式是針對傳入字節數組做爲參數,以及指定字節數組的偏移量時的一些拓展功能。
一旦傳遞了字節數組做爲參數,read將會讀取數據到字節數組,write將會將字節數組的數據寫入。

close 都須要關閉流,因此都有close方法;
都是關閉流並釋放與此流有關的系統資源;
均可能拋出IOException;
在InputStream和OutputStream中,兩個close方法都是空方法;
flush flush的含義爲刷新,在寫入數據時使用。
因此只有輸出流擁有flush方法
之因此須要刷新,是由於有的輸出流的寫方法實現,可能已經緩衝了之前寫入的任何字節,那麼,這個方法用於提供可以當即將數據寫入到磁盤的功能。
不過只是當即請求操做系統進行處理,而不保證這些字節實際已經寫入到物理設備,好比磁

下面幾個爲InputStream獨有
public int available()  throws IOException
返回此輸入流下一個方法調用能夠不受阻塞地今後輸入流讀取(或跳過)的估計字節數。
這句話有些繞口,直白的說就是: 在方法調用前,能夠獲取到這個流中可用的字節數目。 假設說有N個字節可使用,顯然你應該極可能讀取到N個字節,,或者可以跳過N個字節, 一次讀取或跳過此估計數個字節不會受阻塞。
注意:
這個數目是一個預估的數量,實際的讀取或者跳過的字節數可能小於這個數。


InputStream中的這個方法老是返回0  ,因此這個方法可否使用依賴於子類的實現。
public long skip(long n) throws IOException
返回的是實際跳過的字節數。
在內部建立一個 byte 數組,而後重複將字節讀入其中,直到讀夠 n 個字節或已到達流末尾爲止。
reset()mark(int)markSupported()
三個方法是對於同一個功能點的不一樣方法  ,能夠解決重複讀的問題
mark(int)用來在此輸入流中作標記,標記當前位置  打一個書籤;
markSupported()   測試此輸入流是否支持 mark 和 reset 方法;
reset()  將此流從新定位到最後一次對此輸入流調用 mark 方法時的位置   回到書籤
看下類中的默認代碼能夠發現:
  • 默認狀況下mark什麼都不作;spa

  • markSupported直接返回false;操作系統

  • reset方法的調用會拋出異常;code


圖片
mark的參數用於告知輸入流在標記位置失效以前容許讀取的字節數 標記已關閉的流對其無效
提及來很迷惑,用起來卻很簡單
好比 
//代表系統至少應該緩衝50以上個數據,以保證能夠回來從新讀取xxxStream.mark(50);xxxStream.read();.....xxxStream.read();
//reset以後,讀取到的數據將會和剛纔調用mark 方法後read的數據是相同的xxxStream.reset();xxxStream.read();.....xxxStream.read();
若是方法 markSupported 返回 true,那麼輸入流老是在調用 mark 以後記錄全部讀取的字節,並時刻準備在調用方法 reset 時(不管什麼時候),再次提供這些相同的字節。
可是,若是在調用 reset 以前能夠從流中讀取多於 readlimit 的字節,則不須要該流記錄任何數據。

https://mp.weixin.qq.com/s/c8MFam2AdJydyKeUHPqaqgorm

相關文章
相關標籤/搜索