Java IO(二) 之 InputStream,javaioinputstream
源碼均以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修飾的,所以其並不具有執行個體化的能力,要完全藉助於其子類實現對於流的各種操作。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。