引言:Java的IO是Java的重中之重煎楣,之前一直對各種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:主要用來讀取對象的裙犹;(處理對象的序列化的)前提是:該類需要實(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í)服球,會先從第一個(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方法將不會產(chǎn)生效果,調(diào)用close方法之后仍然可以 調(diào)用它的其他方法不會拋出異常
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程序員會更熟悉printf())上忍。
也可以認(rèn)為是一個(gè)輔助工具。主要可以向其他輸出流腋颠,或者FileInputStream 寫入數(shù)據(jù)吓笙,本身內(nèi)部實(shí)現(xiàn)還是帶緩沖的。本質(zhì)上是對其它流的綜合運(yùn)用的一個(gè)工具而已面睛。一樣可以踢出IO 包侮穿!System.out 和System.out 就是PrintStream 的實(shí)例! - 3:ObjectOutputStream:輸出對象(對象序列化):前提是該類實(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è)字符可能會相當(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 對Reader 對象進(jìn)行裝飾,會增加一個(gè)行號莉兰。
- 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 極其類似,后面會有它們的對應(yīng)圖兔毙。
- 1.2.1:FileWriter:FileWriter能夠把數(shù)據(jù)以字符流的形式寫入文件兄春。同樣是處理文件,F(xiàn)ileWriter處理字符赶舆,F(xiàn)ileOutputStream處理字節(jié).根據(jù)不同的編碼方案,一個(gè)字符可能會相當(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ù)行號的BufferedReader填帽。默認(rèn)情況下咙好,行號從0開始,當(dāng)LineNumberReader讀取到行終止符時(shí)勾效,行號會遞增(譯者注:換行\(zhòng)n叛甫,回車\r杨伙,或者換行回車\n\r都是行終止符)。
你可以通過getLineNumber()方法獲取當(dāng)前行號抖苦,通過setLineNumber()方法設(shè)置當(dāng)前行數(shù)(譯者注:setLineNumber()僅僅改變LineNumberReader內(nèi)的記錄行號的變量值米死,不會改變當(dāng)前流的讀取位置。流的讀取依然是順序進(jìn)行究西,意味著你不能通過setLineNumber()實(shí)現(xiàn)流的跳躍讀取)勘天。
三:關(guān)于文件
File對象:
判斷文件夾是否存在:得到文件的父目錄捉邢,如果父目錄不存在就創(chuàng)建目錄;
File parent = file.getParent File();
if(!parent.exists()){
fileP.mkdirs();
}
判斷文件是否存在伏伐,如果不存在就創(chuàng)建:
if(!file.exists()){
file.createNewFile();
}