1. 程式人生 > >[五] JavaIO之InputStream OutputStream簡介 方法列表說明

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

com 關閉流 n) 取數 需要 -m byte[] alt tput

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

基本含義

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

方法列表

技術分享圖片 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方法關鍵點
要麽就是直接返回讀取的字節
要麽就是將讀取到的字節放入字節數組中,字節數組是你傳遞進去的
技術分享圖片
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什麽都不做 markSupported直接返回false reset方法的調用會拋出異常
技術分享圖片
mark的參數用於告知輸入流在標記位置失效之前允許讀取的字節數
標記已關閉的流對其無效
說起來很迷惑,用起來卻很簡單
比如
xxxStream.mark(50);//表明系統至少應該緩沖50以上個數據,以保證可以回來重新讀取
xxxStream.read();
.....
xxxStream.read();

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

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