[五] JavaIO之InputStream OutputStream簡介 方法列表說明


 
InputStream 和 OutputStream 對於字節流的輸入和輸出
是作為協議的存在
所以有必要了解下這兩個類提供出來的基本約定
這兩個類是抽象類,而且基本上沒什么實現,都是依賴於子類具體的去實現
但是他是對於其子類 協議綱領一般的存在
了解清楚每一個方法含義,對於后續具體的子類將會有非常大的幫助

基本含義

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

方法列表

 
image_5b95f27e_7902
 
InputStream  包含了讀取方法以及輔助方法
OutputStream包含了寫入方法以及輔助方法

方法對照

read()
read(byte[])
read(byte[], int, int)
write(byte[])
write(byte[], int, int)
write(int)
close close
  flush()
available()
mark(int)
markSupported()
reset()
skip(long)

方法詳解

 
read
read()  從輸入流中讀取數據的下一個字節。返回 0 到 255 范圍內的 int 字節值
如果因為已經到達流末尾而沒有可用的字節,則返回值 -1
方法將會一直阻塞,直到數據可用,檢測到流的末尾或者拋出異常
無參數的read() 是抽象方法,由實現類提供實現
三個read方法實際上根本方法都是read()方法
其他兩個方法為拓展功能,邏輯便捷方法
無參數的read()返回的數據為讀取到的字節值
而有參數的則是讀取到字節數組中,所以返回值為讀取到的個數
read方法關鍵點
要么就是直接返回讀取的字節
要么就是將讀取到的字節放入字節數組中,字節數組是你傳遞進去的
image_5b95f27f_7672
 
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)  方法是根本
其他的是拓展功能
image_5b95f27f_28a4
 
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 
所以這個方法能否使用依賴於子類的實現

image_5b95f27f_373b
 
public long skip(long n) throws IOException
返回的是實際跳過的字節數
在內部創建一個 byte 數組,然后重復將字節讀入其中,直到讀夠 n 個字節或已到達流末尾為止
image_5b95f27f_6cd7
 
 
reset()
mark(int)
markSupported() 
三個方法是對於同一個功能點的不同方法  ,可以解決重復讀的問題
mark(int)用來在此輸入流中做標記,標記當前位置  打一個書簽
markSupported()   測試此輸入流是否支持 mark 和 reset 方法
reset()  將此流重新定位到最后一次對此輸入流調用 mark 方法時的位置   回到書簽
看下類中的默認代碼可以發現:
默認情況下mark什么都不做
markSupported直接返回false
reset方法的調用會拋出異常
image_5b95f27f_26c1
mark的參數用於告知輸入流在標記位置失效之前允許讀取的字節數
標記已關閉的流對其無效
說起來很迷惑,用起來卻很簡單
比如
xxxStream.mark(50);//表明系統至少應該緩沖50以上個數據,以保證可以回來重新讀取
xxxStream.read();
.....
xxxStream.read();

xxxStream.reset();//reset之后,讀取到的數據將會和剛才調用mark 方法后read的數據是相同的
xxxStream.read();
.....
xxxStream.read();
如果方法 markSupported 返回 true,那么輸入流總是在調用 mark 之后記錄所有讀取的字節
並時刻准備在調用方法 reset 時(無論何時),再次提供這些相同的字節
但是,如果在調用 reset 之前可以從流中讀取多於 readlimit 的字節,則不需要該流記錄任何數據
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM