標籤:max ack append set ble java 擷取 span ret
原始碼均以JDK1.8作為參考
前言:
InputStream實現了兩個介面Closeable和AutoCloseable:
Closeable:JDK1.5中引入,Closeable介面中僅僅有一個close()方法的定義:
public void close() throws IOException;
實現了Closeable介面的類的對象能夠被關閉,流類都實現了該介面,以達到關閉流的目的。
AutoCloseable:JDK1.7中引入,為JDK1.7中引入的帶資源的try語句提供了支援。try能夠自己主動關閉資源。
AutoCloseable介面亦僅僅定義了一個close()方法的定義:
void close() throws Exception;
僅僅有實現了AutoCloseable介面的類的對象才幹夠使用帶資源的try語句進行管理。在JDK1.7中Closeable繼承了AutoCloseable介面,所以IO包下的流類都能夠使用帶資源的try語句進行管理。
原始碼分析:
InputStream是相對於Java本身來說的,從其它途徑向內讀取資料,所以叫輸入資料流。
InputStream是一個抽象類別。是java.io流位元組流的基類。
InputStream中定義了一系列方法。
主要方法:
1.public abstract int read():
從輸入資料流中讀取資料的下一個位元組。返回 0 到 255 範圍內的 int 位元組值。假設由於已經到達流末尾而沒有可用的位元組。則傳回值 -1。
在輸入資料可用、檢測到流末尾或者拋出異常前。此方法一直堵塞。
子類必須提供此方法的一個實現。
2.public int read(byte b[]):
從輸入資料流中讀取一定數量的位元組,並將其儲存在緩衝區數組 b 中。以整數形式返回實際讀取的位元組數。
3.public int read(byte b[], int off, int len):
將輸入資料流中最多 len 個資料位元組讀入 byte(從byte數組的off索引開始讀入) 數組。
嘗試讀取 len 個位元組,但讀取的位元組也可能小於該值。
以整數形式返回實際讀取的位元組數。
註:對於InputStream中的2和3方法,事實上現都是依賴1方法來實現的,通過1方法擷取單個位元組,讀入2和3中指定的緩衝數組中。
4. public long skip(long n):
在輸入資料流中跳過指定位元組數的讀取。跳過的位元組數為n,可是InputStream定義了skip的最大長度MAX_SKIP_BUFFER_SIZE=2048,n超過這個值。將僅僅跳過MAX_SKIP_BUFFER_SIZE個位元組的讀取。原始碼例如以下:
public long skip(long n) throws IOException { long remaining = n; int nr; if (n <= 0) { return 0; } int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining); byte[] skipBuffer = new byte[size]; while (remaining > 0) { nr = read(skipBuffer, 0, (int)Math.min(size, remaining)); if (nr < 0) { break; } remaining -= nr; } return n - remaining; }
相同基於read系列重載方法實現,原理就是直接講指定個數的位元組讀取。可是不進行保留,以完畢skip操作。
5. public int available():
返回該InputStream在不被堵塞的情況下下一次能夠讀到的資料長度。
6. public void close():
關閉InputStream流
7. public synchronized void mark(int readlimit):
標記InputStream流中的某一個位置,由其子類進行詳細實現。
8. public synchronized void reset():
將此流又一次定位到最後一次對此輸入資料流調用 mark 方法時的位置。
9. public boolean markSupported():
檢查此流是否支援詳細實現了public synchronized void mark(int readlimit)方法。
總: InputStream在一定程度上對輸入資料流做了一個抽象。定義了輸入資料流的基本職責,可是並不提供詳細的實現。僅僅是做簡單的約束。並不是強制重寫,由於InputStream是abstract修飾的,所以其並不具有執行個體化的能力,要全然藉助於其子類實現對於流的各種操作。
Java IO(二) 之 InputStream