Java流-總結(jié)

引言:Java的IO是Java的重中之重,之前一直對(duì)各種IO流了解的模模糊糊,今天花了一天時(shí)間將所有常用的IO流均復(fù)習(xí)了以便,遂做以下筆記:


各種流的主要功能:
文件
管道
網(wǎng)絡(luò)連接
內(nèi)存緩存
System.in, System.out, System.error(注:Java標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤輸出)

一:字節(jié)流:

1.1:字節(jié)輸入流

  • 1:inputStream:所有的字節(jié)輸入流的父類,
  • 2:FileInputStream 基本的介質(zhì)流,本地文件中讀取數(shù)據(jù)。注意編碼問題;
  • 3:FilterInputStream:是實(shí)現(xiàn)自定義過濾輸入流的基類,基本上它僅僅只是覆蓋了InputStream中的所有方法。
  • 3.1:BufferedInputStream:字節(jié)緩沖流;字節(jié)裝飾流:可以自定義緩沖大小,主要用來提高字節(jié)流的讀取速度;
  • 3.2:DataInputStream:可以使你從輸入流中讀取Java基本類型數(shù)據(jù),而不必每次讀取字節(jié)數(shù)據(jù)。你可以把InputStream包裝到DataInputStream中,然后就可以從此輸入流中讀取基本類型數(shù)據(jù)了
  • 3.3:PushbackInputStream:用于解析InputStream內(nèi)的數(shù)據(jù)。有時(shí)候你需要提前知道接下來將要讀取到的字節(jié)內(nèi)容,才能判斷用何種方式進(jìn)行數(shù)據(jù)解析。PushBackInputStream允許你這么做,你可以把讀取到的字節(jié)重新推回到InputStream中,以便再次通過read()讀取
  • 4:ObjectInputStream:主要用來讀取對(duì)象的;(處理對(duì)象的序列化的)前提是:該類需要實(shí)現(xiàn)Serializable接口;
  • 5:PipedIInputStream:管道流,主要用來同一個(gè)進(jìn)程的不同線程之間進(jìn)行通信的管道流;一個(gè)PipedInputStream需要與一個(gè)PipedOutputStream相關(guān)聯(lián),當(dāng)這兩種流聯(lián)系起來時(shí),就形成了一條管道;
  • 6:SequenceInputStream:組合流:可以將兩個(gè)字節(jié)流組成一個(gè)流;把一個(gè)或者多個(gè)InputStream整合起來,形成一個(gè)邏輯連貫的輸入流。當(dāng)讀取SequenceInputStream時(shí),會(huì)先從第一個(gè)輸入流中讀取,完成之后再從第二個(gè)輸入流讀取,以此推類;
  • 7:StringBufferInputStream:該流讀取的字節(jié)由字符串的內(nèi)容提供的輸入流。應(yīng)用程序還可以通過使用ByteArrayInputStream.Only字符串中的低八位每個(gè)字符都使用這個(gè)類讀取一個(gè)字節(jié)數(shù)組字節(jié)。
    PS:這個(gè)此類已被Oracle否決,不再被使用。
  • 8:ByteArrayInputStream:基本介質(zhì)流:存在的意義是將內(nèi)存中的一個(gè)byte數(shù)組,讓它可以通過InputStream的API來操作讀取,主要是為了方便;
    注意調(diào)用它的close方法將不會(huì)產(chǎn)生效果,調(diào)用close方法之后仍然可以 調(diào)用它的其他方法不會(huì)拋出異常

1.2:輸出流

  • 1:FlieOutputStream: 基本的介質(zhì)流,向本地文件中輸出數(shù)據(jù)。注意編碼
  • 2:FilterOutputStream:是實(shí)現(xiàn)自定義過濾輸出流的基類,基本上它僅僅只是覆蓋了OutputStream中的所有方法;
  • 2.1:BufferedOutputStream:字節(jié)輸出成緩沖流;字節(jié)裝飾流:可以自定義緩沖大小,主要用來提高字節(jié)流的讀取速度;
  • 2.2:DataOutputStream:可以使你從輸出流中輸出Java基本類型數(shù)據(jù),而不必每次輸出字節(jié)數(shù)據(jù)。你可以把OutputStream包裝到DataOutputStream中,然后就可以從此輸出流中輸出基本類型數(shù)據(jù)了。
  • 2.3:PrintStream:允許你把格式化數(shù)據(jù)寫入到底層OutputStream中。比如,寫入格式化成文本的int,long以及其他原始數(shù)據(jù)類型到輸出流中,而非它們的字節(jié)數(shù)據(jù)。
    PrintStream包含2個(gè)強(qiáng)大的函數(shù),分別是format()和printf()(這兩個(gè)函數(shù)幾乎做了一樣的事情,但是C程序員會(huì)更熟悉printf())。
    也可以認(rèn)為是一個(gè)輔助工具。主要可以向其他輸出流,或者FileInputStream 寫入數(shù)據(jù),本身內(nèi)部實(shí)現(xiàn)還是帶緩沖的。本質(zhì)上是對(duì)其它流的綜合運(yùn)用的一個(gè)工具而已。一樣可以踢出IO 包!System.out 和System.out 就是PrintStream 的實(shí)例!
  • 3:ObjectOutputStream:輸出對(duì)象(對(duì)象序列化):前提是該類實(shí)現(xiàn)了Serializable;
  • 4:PipedOutputStream:管道流:
    主要用于同一個(gè)進(jìn)程里面的兩個(gè)線程之間進(jìn)行通信使用的
    一個(gè)PipedInputStream需要與一個(gè)PipedOutputStream相關(guān)聯(lián),當(dāng)這兩種流聯(lián)系起來時(shí),就形成了一條管道
  • 5:ByteArrayOutputStream:ByteArrayOutputStream 字節(jié)輸出流可以用來緩存我們讀取的數(shù)據(jù);方便二次讀取。

二:字符流:

2.1:字符輸入流

1:Reader:字符輸入流的基類,是一個(gè)抽象類

  • 1.1:BufferedReader:字節(jié)輸入緩沖流,功能和BufferedInputStream類似,只不過它讀取數(shù)據(jù)是以字符為單位的;
  • 1.2:InputStreamReader:字節(jié)流轉(zhuǎn)換成字符流;
  • 1.2.1:FileReader:能夠以字符流的形式讀取文件內(nèi)容。除了讀取的單位不同之外,FileReader與FileInputStream并無太大差異,也就是說,F(xiàn)ileReader用于讀取文本。根據(jù)不同的編碼方案,一個(gè)字符可能會(huì)相當(dāng)于一個(gè)或者多個(gè)字節(jié).
  • 1.3:StringReader:基本的介質(zhì)流,能夠?qū)⒃甲址D(zhuǎn)換成Reader,String中讀取數(shù)據(jù)。
  • 1.4:PipedReader:和PipedInputStream類似,管道字符流,
  • 1.5:ByteArrayReader:和ByteArrayInputStream:作用類似存在的意義是將內(nèi)存中的一個(gè)byte數(shù)組,讓它可以通過InputStream的API來操作讀??;
  • 1.6:FilterReader:是所有自定義具體裝飾流的父類,其子類PushbackReader 對(duì)Reader 對(duì)象進(jìn)行裝飾,會(huì)增加一個(gè)行號(hào)。
  • 1.6.1:PushBackReader:作用和PushBackInputStream類似,允許回寫;

2.2:字符輸出流

1:Writer:所有字符輸出流的基類;是一個(gè)抽象類;

  • 1.1:BufferderWriter:是一個(gè)裝飾器為Writer 提供緩沖功能。
  • 1.2:OutputStreamWriter:字節(jié)輸出流轉(zhuǎn)換成字符輸出流;OutputStream 到Writer 轉(zhuǎn)換的橋梁,它的子類FileWriter 其實(shí)就是一個(gè)實(shí)現(xiàn)此功能的具體類(具體可以研究一SourceCode)。功能和使用和OutputStream 極其類似,后面會(huì)有它們的對(duì)應(yīng)圖。
  • 1.2.1:FileWriter:FileWriter能夠把數(shù)據(jù)以字符流的形式寫入文件。同樣是處理文件,F(xiàn)ileWriter處理字符,F(xiàn)ileOutputStream處理字節(jié).根據(jù)不同的編碼方案,一個(gè)字符可能會(huì)相當(dāng)于一個(gè)或者多個(gè)字節(jié)
  • 1.3:PrintWriter:和PrintStream 極其類似,功能和使用也非常相似。
  • 1.4:StringWriter:能夠以字符串的形式從Writer中獲取寫入到其中數(shù)據(jù)
  • 1.5:PipedWriter:是向與其它線程共用的管道中寫入數(shù)據(jù),一般和PipedReader結(jié)合使用;
  • 1.6:CharArrayWriter:基本介質(zhì)流,向Char 數(shù)組中寫入數(shù)據(jù)。能夠把字符寫入到字符輸出流writer中,并且能夠?qū)懭氲淖址D(zhuǎn)換成字符數(shù)組;
    當(dāng)你需要以字符數(shù)組的形式訪問寫入到writer中的字符流數(shù)據(jù)時(shí),CharArrayWriter是個(gè)不錯(cuò)的選擇。
  • 1.7:FilterWriter:和FilterOutputStream功能類似;裝飾流;
  • 1.8:LineNumberReader是記錄了已讀取數(shù)據(jù)行號(hào)的BufferedReader。默認(rèn)情況下,行號(hào)從0開始,當(dāng)LineNumberReader讀取到行終止符時(shí),行號(hào)會(huì)遞增(譯者注:換行\(zhòng)n,回車\r,或者換行回車\n\r都是行終止符)。
    你可以通過getLineNumber()方法獲取當(dāng)前行號(hào),通過setLineNumber()方法設(shè)置當(dāng)前行數(shù)(譯者注:setLineNumber()僅僅改變LineNumberReader內(nèi)的記錄行號(hào)的變量值,不會(huì)改變當(dāng)前流的讀取位置。流的讀取依然是順序進(jìn)行,意味著你不能通過setLineNumber()實(shí)現(xiàn)流的跳躍讀取)。

三:關(guān)于文件

File對(duì)象:
判斷文件夾是否存在:得到文件的父目錄,如果父目錄不存在就創(chuàng)建目錄;

File parent = file.getParent File();
if(!parent.exists()){
     fileP.mkdirs();
}
判斷文件是否存在,如果不存在就創(chuàng)建:
if(!file.exists()){
     file.createNewFile();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容