天天看點

【Java基礎】IO流

我是 啤酒就辣條,一個Java。 學而時習之,不亦說乎?希望通過部落格的形式,總結、分享,梳理自己、幫助他人。 另外,啤酒就辣條,味道不錯哦~

流是一組有序的位元組集合,是對資料傳輸的抽象。流的本質是資料傳輸,根據傳輸的特性,流又被分為多種情況。

按照資料類型可以分為字元流和位元組流。

位元組流基本機關是一個位元組(8bit),可以處理所有類型的資料。

字元流基本代為是多個位元組(一般是兩個位元組),一般處理字元資料。字元流某種意義可以看作,被包裝過的位元組流。因為字元流是基于位元組流讀取之後,查了特定的碼表,進行字元轉換的。是以,如果是字元類型的資料傳輸,首先使用字元流,其他傳輸使用位元組流。

按照輸入輸出方向可分為輸入流和輸出流。輸入流隻能進行讀操作。輸出流隻能進行寫操作。

根據流的分類,可得位元組輸入流,位元組輸出流,字元輸入流,字元輸出流。這四種分類分别對四個抽象類InputStream、OutputStream、Reader、Writer,Java種所有的IO流類都是繼承其一。

InputStream是所有位元組輸入流的超類。既然是輸入流,肯定會有讀的方法read()

這個方法邏輯很清晰了,首先判斷緩存區能不能放下輸入的資料,然後以位元組為機關讀進緩存區。

還有個方法是跳過或者丢棄輸入流的前n個位元組,但是結果跳過的位元組數可能小于n。

還有幾個方法:

available()傳回可讀位元組數的估計值。

close()關閉位元組輸入流,并釋放相應資源。

mark(int readlimit)在輸入流種标記目前位置。

reset()将此流重新定位到mark()的位置。

markSupported()查詢此輸入流是否支援mark()和reset()方法。

這裡主要說明一下mark()和reset()方法。正常情況下,一個流隻能讀一次。 mark()可以作為标記,某一時刻使用reset()方法讓指針重新回到标記處。

OutputStream是所有位元組輸入流的超類。既然是輸入流,肯定會有讀的方法write()。

主要方法有三個。

write()将指定的位元組轉化成輸出流。

flush()将緩存區資料強制重新整理出去,重新整理到檔案或者外設中。

close()關閉位元組輸出流,并釋放相應資源。

對于InputStream和OutputStream提供的方法很多沒有帶鎖,但往往實作的時候都會帶上鎖。例如往往會加上synchronized。

Reader是所有字元輸入流的超類。

大部分方法和InputStream差不多,隻是從位元組變成了字元。隻是Reader提供了對象級别的鎖。

Writer是所有字元輸入流的超類。當然,Writer也提供了對象級别的鎖。

除此之外,Writer比OutputStream多了append()方法。

append()方法是資料的追加。

write()方法是資料的覆寫。