I/O流詳解

1 I/O流的分類


  • 按照流:

    • 輸入流


      輸出流
    • 輸出流
輸入流
  • 按照數(shù)據(jù)處理單位不同

  • 字節(jié)流
    一次讀入或者是讀取八位二進制拟赊,后綴為Stream

  • 字符流
    一次讀取或是讀取十六位二進制询件,后綴為Reader矾麻、Writer

  • 按照實現(xiàn)功能的不同

  • 節(jié)點流


    節(jié)點流

    當(dāng)直接使用節(jié)點流時,讀寫不方便,為了提高效率,才有了處理流双霍。

  • 處理流


    處理流

    處理流是和節(jié)點流一起使用,在節(jié)點流的基礎(chǔ)上套一層,套在節(jié)點流上的就是處理流洒闸。

2 常見的I/O流


先上圖:

幾個常見的I/O流

3 字節(jié)流


InputStreamOutputStream是兩個abstract類染坯,對于字節(jié)為導(dǎo)向的 stream 都擴展這兩個基類;
3.1 InputStream抽象類

  • 常用的幾個方法

  • available():返回stream中的可讀字節(jié)數(shù),inputstream類中的這個方法始終返回的是0顷蟀,這個方法需要子類去實現(xiàn)酒请。

  • close():關(guān)閉stream方法,這個是每次在用完流之后必須調(diào)用的方法鸣个。

  • read():方法是讀取一個byte字節(jié),但是返回的是int。

  • read(byte[]):一次性讀取內(nèi)容到緩沖字節(jié)數(shù)組

  • read(byte[],int,int):從數(shù)據(jù)流中的哪個位置offset開始讀長度為len的內(nèi)容到緩沖字節(jié)數(shù)組

  • skip(long):從stream中跳過long類型參數(shù)個位置

  • mark(int):用于標(biāo)記stream的作用

  • markSupported():返回的是boolean類型布朦,因為不是所有的stream都可以調(diào)用mark方法的囤萤,這個方法就是用來判斷stream是否可以調(diào)用mark方法和 reset方法

  • reset():這個方法和mark方法一起使用的,讓stream回到mark的位置是趴。


  • ByteArrayInputStream類:把內(nèi)存中的一個緩沖區(qū)作為InputStream使用

    • 構(gòu)造器:
      ByteArrayInputStream(byte[]):創(chuàng)建一個新字節(jié)數(shù)組輸入流涛舍,從指定的字節(jié)數(shù)組中讀取數(shù)據(jù)。(使用byte作為緩沖區(qū)數(shù)組)
      ByteArrayInputStream(byte[],int,int):創(chuàng)建一個新字節(jié)數(shù)組輸入流唆途,從指定的字節(jié)數(shù)組指定范圍讀取數(shù)據(jù)富雅。
  • StringBufferInputSteam類:把一個字符串作為InputStream

  • 構(gòu)造器:
    StringBufferInputStream(String )
    不建議使用該類,因為該類不能將字符正確的轉(zhuǎn)換成字節(jié)肛搬。

  • FileInputStream類:將一個文件作為InputStream没佑,對文件進行操作

  • 構(gòu)造器:
    FileInputStream(File):創(chuàng)建一個文件流,從一個文件中進行讀取數(shù)據(jù)
    FileInputStream(FileDescriptor):創(chuàng)建一個文件流温赔,從指定的文件描述中讀取數(shù)據(jù)
    FileInputStream(String):創(chuàng)建一個輸入文件流蛤奢,從指定的文件名稱中讀取數(shù)據(jù)。

  • PipeInputStream類:實現(xiàn)了pipe的概念陶贼,在線程中使用啤贩,管道輸入流是只一個通訊管道的接收端。

  • 構(gòu)造器:
    PipeInputStream():創(chuàng)建一個管道輸入流拜秧,它還未和一個管道輸出流連接痹屹。
    PipeInputStream(PipeOutStream):創(chuàng)建一個管道輸入流,已經(jīng)和管道輸出流連接枉氮。

  • 方法:
    除了實現(xiàn)InputStream中的部分方法外志衍,還有一個額外的方法
    connection(PipeOutStream):和一個管道輸出流連接

  • SequenceInputStream類:把多個InputStream流合并成一個InputStream(序列化流),序列化流允許把幾個單獨的輸入流合并到一起嘲恍,并讓他們像單個輸入流一樣按順序輸入足画,當(dāng)前一個輸入流完成后序列化流將自動關(guān)閉該流并切換到下一個輸入流。

  • 構(gòu)造器:
    SequenceInputStream(Enumeration)創(chuàng)建一個新的序列化流佃牛,并使用一個輸入流的枚舉初始化它淹辞。
    SequenceInputStream(InputStream,InputStream,InputStream...)

  • FilterInputStream:一個過濾的InputStream
    兩個常用的子類

  1. BufferedInputStream:使用緩沖區(qū)的InputStream
  • 構(gòu)造器:
    BufferedInputStream (InputStream):用InputStream作為參數(shù)初始化實例。
    BufferedInputStream (InputStream,int):設(shè)置緩沖區(qū)大小的實例。
  1. DataInputStream:數(shù)字格式化的stream
  • 構(gòu)造器
    DataInputStream(InputStream):使用InputStream參數(shù)來初始化實例
  • 額外的方法:
    readInt,readFloat,readDouble...這樣可以直接從stream中讀取基本類型的數(shù)據(jù)

3.2 OutPutStream抽象類

  • 常用的幾個方法

  • write(int):寫入一個字節(jié)到stream中

  • write(byte[])寫入一個byte數(shù)組到stream中

  • write(byte[],int,int):把byte數(shù)組中從offset開始處寫入長度為len的數(shù)據(jù)

  • close():關(guān)閉流象缀,這個是在操作完stream之后必須要調(diào)用的方法

  • flush():這個方法是用來刷新stream中的數(shù)據(jù)蔬将,讓緩沖區(qū)中的數(shù)據(jù)強制的輸出


  • ByteArrayOutputStream: 把信息存入內(nèi)存中的一個緩沖區(qū)中 . 該類實現(xiàn)一個以字節(jié)數(shù)組形式寫入數(shù)據(jù)的輸出流,當(dāng)數(shù)據(jù)寫入緩沖區(qū)時央星,它自動擴大霞怀。用 toByteArray() 和 toString() 能檢索數(shù)據(jù)。

  • 構(gòu)造器
    ByteArrayOutputStream()創(chuàng)建一個新的字節(jié)數(shù)組輸出流莉给。
    ByteArrayOutputStream(int)創(chuàng)建一個新的字節(jié)數(shù)組輸出流毙石,并帶有指定大小字節(jié)的緩沖區(qū)容量。

  • 額外的方法:
    toByteArray()將字節(jié)流轉(zhuǎn)化成一個字節(jié)數(shù)組颓遏,用于數(shù)據(jù)的檢索
    toString()將字節(jié)流轉(zhuǎn)化成一個String對象徐矩,默認(rèn)采用系統(tǒng)的編碼轉(zhuǎn)化,同樣可以用于數(shù)據(jù)的檢索
    toString(String) 根據(jù)指定字符編碼將緩沖區(qū)內(nèi)容轉(zhuǎn)換為字符串叁幢,并將字節(jié)轉(zhuǎn)換為字符滤灯。
    writeTo(OutputStream)out.write(buf, 0, count)調(diào)用輸出流的寫方法將該字節(jié)數(shù)組輸出流的全部內(nèi)容寫入指定的輸出流參數(shù)。

  • FileOutputStream: 文件輸出流是向 File 或 FileDescriptor 輸出數(shù)據(jù)的一個輸出流曼玩。

  • 構(gòu)造器
    FileOutputStream(File name)創(chuàng)建一個文件輸出流鳞骤,向指定的 File 對象輸出數(shù)據(jù)。
    FileOutputStream(FileDescriptor)創(chuàng)建一個文件輸出流黍判,向指定的文件描述器輸出數(shù)據(jù)豫尽。
    FileOutputStream(String name)創(chuàng)建一個文件輸出流,向指定名稱的文件輸出數(shù)據(jù)样悟。
    FileOutputStream(String, boolean) 用指定系統(tǒng)的文件名拂募,創(chuàng)建一個輸出文件。

  • PipedOutputStream: 管道輸出流是指一個通訊管道的發(fā)送端窟她。 一個線程通過管道輸出流發(fā)送數(shù)據(jù)陈症,而另一個線程通過管道輸入流讀取數(shù)據(jù),這樣可實現(xiàn)兩個線程間的通訊震糖。

  • 構(gòu)造器
    PipedOutputStream()創(chuàng)建一個管道輸出流录肯,它還未與一個管道輸入流連接。
    PipedOutputStream(PipedInputStream)創(chuàng)建一個管道輸出流吊说,它已連接到一個管道輸入流论咏。

  • 額外的方法:
    connection(PipedInputStream):連接一個PipedInputStream方法

4 字符流


Unicode字符為導(dǎo)向的流,表示以Unicode字符為單位向Stream中存儲或者是從Stream中讀取颁井。Reader/Writer為抽象類厅贪,其中方法和InputStream和OutputStraem中對應(yīng)。

4.1 Reader

  • CharArrayReader :與 ByteArrayInputStream 對應(yīng)此類實現(xiàn)一個可用作字符輸入流的字符緩沖區(qū)

  • 構(gòu)造器
    CharArrayReader(char[]) 用指定字符數(shù)組創(chuàng)建一個 CharArrayReader 雅宾。
    CharArrayReader(char[], int, int) 用指定字符數(shù)組創(chuàng)建一個 CharArrayReader

  • StringReader: 與 StringBufferInputStream 對應(yīng)其源為一個字符串的字符流养涮。

  • FileReader **: 與 FileInputStream 對應(yīng)

  • PipedReader **:與 PipedInputStream 對應(yīng)

  • InputStreamReader**:將InputStream轉(zhuǎn)化成Reader

4.2 Writer

  • CharArrayWriter: 與 ByteArrayOutputStream對應(yīng)

  • StringWriter:無與之對應(yīng)的以字節(jié)為導(dǎo)向的stream

  • FileWriter: 與FileOutputStream 對應(yīng)

  • PipedWriter:與 PipedOutputStream對應(yīng)

  • OutputStreamWriter:將OutputStream轉(zhuǎn)化成Writer

  • PrintReader:和PrintStream對應(yīng)

5 兩種不同流之間的轉(zhuǎn)換


  • InputStreamReader 類是從字節(jié)流到字符流的橋梁:它讀入字節(jié),并根據(jù)指定的編碼方式,將之轉(zhuǎn)換為字符流贯吓。
    使用的編碼方式可能由名稱指定懈凹,或平臺可接受的缺省編碼方式。
  • InputStreamReader 的 read() 方法之一的每次調(diào)用悄谐,可能促使從基本字節(jié)輸入流中讀取一個或多個字節(jié)介评。
    **為了達到更高效率,考慮用 BufferedReader 封裝 InputStreamReader **

6 Java IO 的一般使用原則


  • 按數(shù)據(jù)來源(去向)分類:
    1 是文件: FileInputStream, FileOutputStream, ( 字節(jié)流 )FileReader, FileWriter( 字符 )
    2.是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字節(jié)流 )
    3 是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )
    4 是 String: StringBufferInputStream, StringBufferOuputStream ( 字節(jié)流 )StringReader, StringWriter( 字符流 )
    5 網(wǎng)絡(luò)數(shù)據(jù)流: InputStream, OutputStream,( 字節(jié)流 ) Reader, Writer( 字符流 )

  • 按是否格式化輸出分:
    1 要格式化輸出: PrintStream, PrintWriter

  • 按是否要緩沖分:
    1 要緩沖: BufferedInputStream, BufferedOutputStream,( 字節(jié)流 ) BufferedReader, BufferedWriter( 字符流 )

  • 按數(shù)據(jù)格式分:
    1 二進制格式(只要不能確定是純文本的) : InputStream, OutputStream 及其所有帶 Stream 結(jié)束的子類
    2 純文本格式(含純英文與漢字或其他編碼方式)爬舰; Reader, Writer 及其所有帶 Reader, Writer 的子類

  • 按輸入輸出分:
    1 輸入: Reader, InputStream 類型的子類
    2 輸出: Writer, OutputStream 類型的子類

  • 特殊需要:
    1 從 Stream 到 Reader,Writer 的轉(zhuǎn)換類: InputStreamReader, OutputStreamWriter
    2 對象輸入輸出: ObjectInputStream, ObjectOutputStream
    3 進程間通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
    4 合并輸入: SequenceInputStream
    5 更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末们陆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子情屹,更是在濱河造成了極大的恐慌棒掠,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屁商,死亡現(xiàn)場離奇詭異,居然都是意外死亡颈墅,警方通過查閱死者的電腦和手機蜡镶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恤筛,“玉大人官还,你說我怎么就攤上這事《咎常” “怎么了望伦?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煎殷。 經(jīng)常有香客問我屯伞,道長,這世上最難降的妖魔是什么豪直? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任劣摇,我火速辦了婚禮,結(jié)果婚禮上弓乙,老公的妹妹穿的比我還像新娘末融。我一直安慰自己,他們只是感情好暇韧,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布勾习。 她就那樣靜靜地躺著,像睡著了一般懈玻。 火紅的嫁衣襯著肌膚如雪巧婶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音粹舵,去河邊找鬼钮孵。 笑死,一個胖子當(dāng)著我的面吹牛眼滤,可吹牛的內(nèi)容都是我干的巴席。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼诅需,長吁一口氣:“原來是場噩夢啊……” “哼漾唉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堰塌,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤赵刑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后场刑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體般此,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年牵现,在試婚紗的時候發(fā)現(xiàn)自己被綠了铐懊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞎疼,死狀恐怖科乎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贼急,我是刑警寧澤茅茂,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站太抓,受9級特大地震影響空闲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腻异,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一进副、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悔常,春花似錦影斑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至残邀,卻和暖如春皆辽,著一層夾襖步出監(jiān)牢的瞬間柑蛇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工驱闷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耻台,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓空另,卻偏偏與公主長得像盆耽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扼菠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

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

  • 一摄杂、流的概念和作用。 流是一種有順序的循榆,有起點和終點的字節(jié)集合析恢,是對數(shù)據(jù)傳輸?shù)目偝苫虺橄蟆<磾?shù)據(jù)在兩設(shè)備之間的傳輸...
    布魯斯不吐絲閱讀 10,023評論 2 95
  • Java 流在處理上分為字符流和字節(jié)流秧饮。字符流處理的單元為 2 個字節(jié)的 Unicode 字符映挂,分別操作字符、字符...
    布魯斯不吐絲閱讀 689評論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盗尸,服務(wù)發(fā)現(xiàn)袖肥,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • tags:io categories:總結(jié) date: 2017-03-28 22:49:50 不僅僅在JAVA領(lǐng)...
    行徑行閱讀 2,171評論 0 3
  • 這幾天油狂,有老同學(xué)問我:是不是寫字會上癮历恐,現(xiàn)在一有時間就想做這件事?我想了一下专筷,好像還真是弱贼,不過現(xiàn)在還多了一點:微信...
    郭小果子閱讀 369評論 0 1