天天看點

Java IO 之 InputStream源碼(2)一、InputStream二、細解InputStream源碼的核心三、小結

writer:李強強

inputstream是一個抽象類,即表示所有位元組輸入流實作類的基類。它的作用就是抽象地表示所有從不同資料源産生輸入的類,例如常見的fileinputstream、filterinputstream等。那些資料源呢?比如:

1) 位元組數組(不代表string類,但可以轉換) 2) string對象 3) 檔案 4) 一個其他種類的流組成的序列化 (在分布式系統中常見) 5) 管道(多線程環境中的資料源) 等等

二者,注意它是屬于位元組流部分,而不是字元流(java.io中reader\writer,下面會講到)。

filterinputstream是為各種inputstream實作類提供的“裝飾器模式”的基類。是以,可以分為原始的位元組流和“裝飾”過的功能封裝位元組流。

源碼如下:

其中,inputstream下面三個read方法才是核心方法:

抽象方法,沒有具體實作。因為子類必須實作此方法的一個實作。這就是輸入流的關鍵方法。

二者,可見下面兩個read()方法都調用了這個方法子類的實作來完成功能的。

該方法是表示從輸入流中讀取資料的一定數量位元組,并存儲在緩存位元組數組b。其效果等同于調用了下面方法的實作:

如果<code>b</code>的長度為 0,則不讀取任何位元組并傳回 <code>0</code>;否則,嘗試讀取至少 1 位元組。如果因為流位于檔案末尾而沒有可用的位元組,則傳回值 <code>-1</code>;否則,至少讀取一個位元組并将其存儲在 <code>b</code> 中。

思考:這時候,怪不得很多時候, b != –1 或者 b != eof

在輸入資料可用、檢測到流末尾或者抛出異常前,此方法一直阻塞。

該方法先進行校驗,然後校驗下個位元組是否為空。如果校驗通過後,

如下代碼:

将讀取的第一個位元組存儲在元素 <code>b[off]</code> 中,下一個存儲在 <code>b[off+1]</code> 中,依次類推。讀取的位元組數最多等于 <code>len</code>。設 k 為實際讀取的位元組數;這些位元組将存儲在 <code>b[off]</code> 到 <code>b[off+</code>k<code>-1]</code> 的元素中,不影響 <code>b[off+</code>k<code>]</code> 到 <code>b[off+len-1]</code> 的元素。

因為有上面兩個read的實作,是以這裡inputstream設計為抽象類。

1. inputsream 對應着 outputstream 2. 看源碼是享受人家寫代碼中流露的how 3. 泥瓦匠學習的代碼都在github上(同步osc git),歡迎大家點star,提意見,一起進步。位址:https://github.com/jeffli1993