Java IO(二) 之 InputStream

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.