Java IO(二) 之 InputStream,javaioinputstream

來源:互聯網
上載者:User

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修飾的,所以其並不具有執行個體化的能力,要完全藉助於其子類實現對於流的各種操作。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.