InputStream 、 DataInputStream 與 BufferedInputStream

Java 有很多不同的 InputStream 類別,老是搞不清楚,InputStreamDataInputStreamBufferedInputStream最近出現在我看的書的練習題裡,一些從 Java Doc (1.8) 文件中拉出來的相關連結:

InputStream是抽象類別,實踐了Closeable,所以可以當成try with resource裡的資源。類別方法裡定義了InputStream.nullInputStream()可以產生空的InputStream。另外也規範所有實作子類別必須提供public int read() throws IOException方法來回傳下一個 byte 的內容。

FilterInputStream在生成時吃進InputStream後把InputStream存起來,並且覆寫了所有InputStream裡的方法,大部分覆寫的方法都是把原來的操作轉到物件生成時丟進去的InputStream上,以供更細分的子類別使用,例如:

public int read(byte b[], int off, int len) throws IOException {
    return in.read(b, off, len);
}

DataInputStreamBufferedInputStream都進一步繼承FilterInputStreamDataInputStream主要是從InputStream直接讀入 Java 的 primitive data type。

BufferedInputStream在內部會產生一個緩衝陣列(buffer array)來支援markreset方法,透過額外使用的緩衝空間來先讀入資料,以優化資料讀入的效能。