簡述InputStream接口

概念

源碼說明:This abstract class is the superclass of all classes representing an input stream of bytes(個(gè)人理解為:定義輸入字節(jié)流的規(guī)范捣炬。即需要輸入字節(jié)流可按照這個(gè)規(guī)范實(shí)現(xiàn))

內(nèi)部結(jié)構(gòu)

屏幕截圖 2020-04-25 20.43.15.png
  • 讀取數(shù)據(jù)
    1. read():從輸入數(shù)據(jù)的流中獲取下一個(gè)字節(jié)數(shù)據(jù)(雖然返回int類型熊昌,但存儲(chǔ)范圍是0-255)。該方法將\color{red}{阻塞}湿酸,直到可用輸入數(shù)據(jù)婿屹、檢測到文件結(jié)尾(返回-1)或引發(fā)異常為止。
    2. read(byte[]):從輸入流中讀取一定數(shù)量的字節(jié)推溃,并將其存儲(chǔ)到緩沖區(qū)數(shù)組中昂利。實(shí)際讀取的字節(jié)數(shù)以整數(shù)形式返回。該方法將\color{red}{阻塞}铁坎,直到可用輸入數(shù)據(jù)蜂奸、檢測到文件結(jié)尾或引發(fā)異常為止。
    3. read(byte[], int, int):從輸入流中最多讀取n個(gè)字節(jié)的數(shù)據(jù)到字節(jié)數(shù)組中硬萍。實(shí)際讀取的字節(jié)數(shù)以整數(shù)形式返回扩所。 此方法將\color{red}{阻塞},直到可用輸入數(shù)據(jù)襟铭、檢測到文件結(jié)尾或引發(fā)異常為止。
  • 標(biāo)記數(shù)據(jù)(重讀數(shù)據(jù))
    1. markSupported():判斷當(dāng)前輸入流是否支持 mark和reset方法
    2. mark(int):標(biāo)記此輸入流中的當(dāng)前位置。后續(xù)調(diào)用reset 方法將從最后一個(gè)標(biāo)記位置開始讀取字節(jié)流寒砖。入?yún)⒈硎緲?biāo)記位置變?yōu)闊o效之前可以讀取的最大字節(jié)數(shù)限制
    3. reset():將此流重新定位到在此輸入流上最后一次調(diào)用mark 方法時(shí)的位置
  • 其他
    1. shik(long):跳過并丟棄此輸入流中的n個(gè)字節(jié)的數(shù)據(jù)(跳過的數(shù)據(jù)還是可以通過mark與reset重新讀却土印)
    2. available():返回可以從此輸入流讀取(或跳過)而不會(huì)被該輸入流的方法的下一次調(diào)用\color{red}{阻塞的字節(jié)數(shù)}的估計(jì)值
    3. close():關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源

接口實(shí)現(xiàn)

為了更好的理解InputStream接口哩都,咱們選擇一個(gè)具體實(shí)現(xiàn)來學(xué)習(xí)魁兼。這里咱們選擇java.io.ByteArrayInputStream


屏幕截圖 2020-04-25 22.06.27.png
package java.io;

/**
 * @author  Arthur van Hoff
 * @see     java.io.StringBufferInputStream
 * @since   JDK1.0
 */
public class ByteArrayInputStream extends InputStream {

    /**
     * 存儲(chǔ)當(dāng)前流的所有流數(shù)據(jù),read操作即獲取數(shù)組中數(shù)據(jù)
     */
    protected byte buf[];

    /**
     * 記錄下次read操作的數(shù)組(buf[])下標(biāo)值
     */
    protected int pos;

    /**
     * 記錄當(dāng)前流被標(biāo)記的數(shù)組(buf[])下標(biāo)值漠嵌,通過mark方法設(shè)置咐汞,執(zhí)行reset方法時(shí)將pos設(shè)置為mark
     *
     * @since   JDK1.1
     */
    protected int mark = 0;

    /**
     * 記錄當(dāng)前流能被read的最大下標(biāo)值+1
     */
    protected int count;

    /**
     * 構(gòu)造函數(shù)
     *
     * @param   當(dāng)前流的所有數(shù)據(jù)
     */
    public ByteArrayInputStream(byte buf[]) {
        this.buf = buf;
        this.pos = 0;
        this.count = buf.length;
    }

    /**
     * 構(gòu)造函數(shù)
     *
     * @param   buf      當(dāng)前流的所有數(shù)據(jù)
     * @param   offset   開始被read的數(shù)組下標(biāo)值
     * @param   length   允許被read的總字節(jié)數(shù)
     */
    public ByteArrayInputStream(byte buf[], int offset, int length) {
        this.buf = buf;
        this.pos = offset;
        this.count = Math.min(offset + length, buf.length);
        this.mark = offset;
    }

    /**
     * 獲取當(dāng)前流的下一個(gè)字節(jié)
     *
     * @return 讀取的字節(jié),如果超過最大運(yùn)行被讀的字節(jié)時(shí)則返回-1
     */
    public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
    }

    /**
     * 將當(dāng)前流中最多l(xiāng)en個(gè)字節(jié)數(shù)據(jù)讀取到一個(gè)字節(jié)數(shù)組中s
     *
     * @param   b     存儲(chǔ)本次讀取的字節(jié)組
     * @param   off   目標(biāo)數(shù)組b開始存儲(chǔ)讀取字節(jié)數(shù)組的下標(biāo)值
     * @param   len  最大讀取字節(jié)數(shù)
     * @return  總共讀取字節(jié)數(shù)儒鹿,如果到達(dá)流結(jié)尾則返回-1
     */
    public synchronized int read(byte b[], int off, int len) {
        if (b == null) {
            throw new NullPointerException();
        } else if (off < 0 || len < 0 || len > b.length - off) {
            throw new IndexOutOfBoundsException();
        }

        if (pos >= count) {
            return -1;
        }

        int avail = count - pos;
        if (len > avail) {
            len = avail;
        }
        if (len <= 0) {
            return 0;
        }
        System.arraycopy(buf, pos, b, off, len);
        pos += len;
        return len;
    }

    /**
     * 跳過n個(gè)字節(jié)
     *
     * @param   n   需要跳過的字節(jié)總數(shù)
     * @return  實(shí)際跳過的字節(jié)總數(shù)
     */
    public synchronized long skip(long n) {
        long k = count - pos;
        if (n < k) {
            k = n < 0 ? 0 : n;
        }

        pos += k;
        return k;
    }

    /**
     * 返回可以從此輸入流讀然骸(或跳過)而不會(huì)阻塞的剩余字節(jié)數(shù)。
     *
     * @return  可以從此輸入流讀仍佳住(或跳過)而不會(huì)阻塞的剩余字節(jié)數(shù)
     */
    public synchronized int available() {
        return count - pos;
    }

    /**
     * 判斷當(dāng)前輸入流是否支持 mark和reset方法(總是返回true)植阴。
     *
     * @since   JDK1.1
     */
    public boolean markSupported() {
        return true;
    }

    /**
     * 設(shè)置流中的當(dāng)前標(biāo)記位置
     *
     * 注意:此類的readAheadLimit沒有任何意義。
     *
     * @since   JDK1.1
     */
    public void mark(int readAheadLimit) {
        mark = pos;
    }

    /**
     * 將緩沖區(qū)重置到標(biāo)記的位置圾浅。除非在構(gòu)造函數(shù)中標(biāo)記了另一個(gè)位置或指定了偏移量掠手,否則標(biāo)記的位置為0。
     */
    public synchronized void reset() {
        pos = mark;
    }

    /**
     * 關(guān)閉ByteArrayInputStream無效狸捕∨绺耄可以在關(guān)閉流之后調(diào)用此類中的方法,而不會(huì)生成IOException灸拍。
     */
    public void close() throws IOException {
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末做祝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子株搔,更是在濱河造成了極大的恐慌剖淀,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纤房,死亡現(xiàn)場離奇詭異纵隔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)炮姨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門捌刮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舒岸,你說我怎么就攤上這事绅作。” “怎么了蛾派?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵俄认,是天一觀的道長个少。 經(jīng)常有香客問我,道長眯杏,這世上最難降的妖魔是什么夜焦? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮岂贩,結(jié)果婚禮上茫经,老公的妹妹穿的比我還像新娘。我一直安慰自己萎津,他們只是感情好卸伞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锉屈,像睡著了一般荤傲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上部念,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天弃酌,我揣著相機(jī)與錄音,去河邊找鬼儡炼。 笑死妓湘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乌询。 我是一名探鬼主播榜贴,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼妹田!你這毒婦竟也來了唬党?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤鬼佣,失蹤者是張志新(化名)和其女友劉穎驶拱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晶衷,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓝纲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晌纫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片税迷。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锹漱,靈堂內(nèi)的尸體忽然破棺而出箭养,到底是詐尸還是另有隱情,我是刑警寧澤哥牍,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布毕泌,位于F島的核電站喝检,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撼泛。R本人自食惡果不足惜蛇耀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坎弯。 院中可真熱鬧,春花似錦译暂、人聲如沸抠忘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崎脉。三九已至,卻和暖如春伯顶,著一層夾襖步出監(jiān)牢的瞬間囚灼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工祭衩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灶体,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓掐暮,卻偏偏與公主長得像蝎抽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子路克,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容