Java流-總結(jié)

引言: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();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末藐翎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子堤器,更是在濱河造成了極大的恐慌末贾,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辉川,死亡現(xiàn)場離奇詭異拴测,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)集索,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渺鹦,“玉大人,你說我怎么就攤上這事塞颁∥ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵伴网,是天一觀的道長妆棒。 經(jīng)常有香客問我,道長糕珊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任澜公,我火速辦了婚禮喇肋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甚侣。我一直安慰自己间学,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布宗兼。 她就那樣靜靜地躺著氮采,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹊漠。 梳的紋絲不亂的頭發(fā)上茶行,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天畔师,我揣著相機(jī)與錄音牧牢,去河邊找鬼。 笑死塔鳍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腔寡。 我是一名探鬼主播掌唾,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凭语!你這毒婦竟也來了情连?” 一聲冷哼從身側(cè)響起览效,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挽拔,沒想到半個(gè)月后但校,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡术裸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年亭枷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猾编。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡答倡,死狀恐怖轰传,靈堂內(nèi)的尸體忽然破棺而出瘪撇,到底是詐尸還是另有隱情,我是刑警寧澤锦茁,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布叉存,位于F島的核電站,受9級特大地震影響稿存,放射性物質(zhì)發(fā)生泄漏瞳秽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一袖迎、第九天 我趴在偏房一處隱蔽的房頂上張望腺晾。 院中可真熱鬧燕锥,春花似錦悯蝉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奸例,卻和暖如春哈误,著一層夾襖步出監(jiān)牢的瞬間躏嚎,已是汗流浹背菩貌。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箭阶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓嘹叫,卻偏偏與公主長得像诈乒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子喂饥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

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