什么是I/O 流,如何分類

什么是I/O 流逮京,如何分類

Java的核心庫http://java.io提供了全面的I/O接口疯潭。所謂I/O其實(shí)是Input和Output的縮寫概说,在Java中,I/O指的是通過數(shù)據(jù)流震缭、序列化和文件系統(tǒng)提供系統(tǒng)的輸入和輸出赂毯。

Java中的I/O是以流為基礎(chǔ)實(shí)現(xiàn)輸入/輸出的,流是一個(gè)很形象的概念拣宰,當(dāng)程序需要讀取數(shù)據(jù)(Input)時(shí)党涕,就會(huì)開啟一個(gè)通向數(shù)據(jù)源的流,這個(gè)數(shù)據(jù)源可以是文件巡社、內(nèi)存膛堤,或者網(wǎng)絡(luò)連接;當(dāng)程序需要寫入數(shù)據(jù)(Output)時(shí)晌该,就會(huì)開啟一個(gè)通向目的地的流肥荔。數(shù)據(jù)好像在其中“流”動(dòng)一樣。所以朝群,我們會(huì)經(jīng)常聽到I/O流這樣的描述燕耿。

Java中的I/O是一個(gè)非常龐大的體系,下面介紹I/O流的分類姜胖。

I/O流的分類方式有許多種缸棵,按照流的方向可以分為輸入流和輸出流;按照數(shù)據(jù)傳輸?shù)膯挝挥挚梢詣澐譃樽止?jié)流和字符流谭期。

1. 輸入流與輸出流

對(duì)于輸入和輸出堵第,需要有一個(gè)參照物,我們?cè)诿枋隽鞯姆较驎r(shí)隧出,可以把外部輸入設(shè)備作為參照物踏志。

當(dāng)程序要從外部輸入設(shè)備,如文件胀瞪、網(wǎng)絡(luò)等讀取數(shù)據(jù)時(shí)针余,流的方向是外部輸入設(shè)備到運(yùn)行程序饲鄙,這種方向的I/O流我們稱之為輸入流。

當(dāng)程序要把數(shù)據(jù)寫入外部輸入設(shè)備時(shí)圆雁,流的方向是運(yùn)行程序到外部設(shè)備忍级,這種方向的I/O流我們稱之為輸出流,如圖14-1所示伪朽。

image.png

2. 字節(jié)與字符

I/O流的作用是傳輸數(shù)據(jù)轴咱,根據(jù)數(shù)據(jù)傳輸?shù)膯挝豢梢园袸/O流分為字節(jié)流和字符流。那么什么是字節(jié)和字符呢烈涮?

在計(jì)算機(jī)中朴肺,數(shù)據(jù)的最小單位是比特(bit),比特是信息技術(shù)中最基本的存儲(chǔ)單元坚洽,二進(jìn)制中的一位就是1 bit戈稿。

但是因?yàn)楸忍靥×耍晕覀兺ǔT谟?jì)量數(shù)據(jù)容量時(shí)讶舰,會(huì)采用字節(jié)(Byte)這種計(jì)量單位鞍盗。在大多數(shù)計(jì)算機(jī)系統(tǒng)中,一個(gè)字節(jié)(Byte)是一個(gè)8位(bit)長的數(shù)據(jù)單位跳昼,所以Byte和bit之間的換算關(guān)系是 1 Byte=8 bit 橡疼。

通常我們也把Byte縮寫成B,隨著存儲(chǔ)容量越來越大庐舟,我們也經(jīng)常使用KB欣除、MB、GB挪略、TB等表示數(shù)據(jù)容量历帚。

除了以字節(jié)為傳輸單位,還有一種常見的傳輸方式——傳輸字符杠娱。

字符(Char挽牢,Character)是計(jì)算機(jī)中使用的字母、數(shù)字摊求、字和符號(hào)禽拔,比如A、B室叉、1睹栖、$等。

一般情況下茧痕,一個(gè)英文字符占用1字節(jié)野来,一個(gè)漢字字符占用2字節(jié)。這只是通常的情況踪旷,因?yàn)樵诓煌木幋a方式下曼氛,字符占用的字節(jié)數(shù)是不一定的豁辉,關(guān)于這部分知識(shí),我們?cè)诘?3章中會(huì)重點(diǎn)介紹舀患。

因?yàn)橐粋€(gè)字符至少要占用1字節(jié)徽级,所以字符是比字節(jié)更大的一種計(jì)量單位。

3. 字節(jié)流與字符流

在I/O流中聊浅,傳輸?shù)臄?shù)據(jù)類型是字節(jié)(Byte)的就是字節(jié)流餐抢,傳輸?shù)臄?shù)據(jù)類型是字符(Char)的就是字符流。

在Java中狗超,操作字節(jié)類型的數(shù)據(jù)的主要操作類是OutputStream和InputStream的子類,操作字符類型的數(shù)據(jù)的主要操作類是Reader和Writer的子類朴下。

如果按照流向來區(qū)分這四種類努咐,那么InputStream和Reader是輸入流,而OutputStream和Writer是輸出流殴胧,如表所示渗稍。

image.png

4. 字節(jié)流與字符流的互相轉(zhuǎn)換

在Java的I/O體系中,除了字節(jié)流团滥、字符流需要用的這四種I/O相關(guān)的類竿屹,還存在一組字節(jié)流—字符流的轉(zhuǎn)換類。也就是說灸姊,字節(jié)流和字符流之間是可以相互轉(zhuǎn)換的拱燃,當(dāng)我們想要把字符流轉(zhuǎn)成字節(jié)流時(shí),可以使用OutputStreamWriter力惯;當(dāng)我們想要把字節(jié)流轉(zhuǎn)成字符流時(shí)碗誉,可以使用InputStreamReader。

OutputStreamWriter:Writer的子類父晶,是字符流通向字節(jié)流的橋梁哮缺,將輸出的字符流變?yōu)樽止?jié)流,即將一個(gè)字符流的輸出對(duì)象變?yōu)樽止?jié)流輸出對(duì)象甲喝。其用法如下:

public static void main(String[] args) throws IOException {
File f = new File("io.txt");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(f),"UTF-8");
osw.write(" 字符轉(zhuǎn)成字節(jié)輸出");
osw.close();
}

InputStreamReader:Reader的子類尝苇,是字節(jié)流通向字符流的橋梁,將輸入的字節(jié)流變?yōu)樽址鞑号郑磳⒁粋€(gè)字節(jié)流的輸入對(duì)象變?yōu)樽址鞯妮斎雽?duì)象糠溜。其用法如下:

public static void main(String[] args) throws IOException {
File f = new File("io.txt");
InputStreamReader inr = new InputStreamReader(new FileInputStream(f),"UTF-8");
char[] buf = new char[1024];
int len = inr.read(buf);
System.out.println(new String(buf,0,len));
inr.close();
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市直撤,隨后出現(xiàn)的幾起案子诵冒,更是在濱河造成了極大的恐慌,老刑警劉巖谊惭,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汽馋,死亡現(xiàn)場離奇詭異侮东,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)豹芯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門悄雅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铁蹈,你說我怎么就攤上這事宽闲。” “怎么了握牧?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵容诬,是天一觀的道長。 經(jīng)常有香客問我沿腰,道長览徒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任颂龙,我火速辦了婚禮习蓬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘措嵌。我一直安慰自己躲叼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布企巢。 她就那樣靜靜地躺著枫慷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浪规。 梳的紋絲不亂的頭發(fā)上流礁,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音罗丰,去河邊找鬼神帅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛萌抵,可吹牛的內(nèi)容都是我干的找御。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼绍填,長吁一口氣:“原來是場噩夢啊……” “哼霎桅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讨永,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤滔驶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后卿闹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揭糕,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萝快,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了著角。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揪漩。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吏口,靈堂內(nèi)的尸體忽然破棺而出奄容,到底是詐尸還是另有隱情,我是刑警寧澤产徊,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布昂勒,位于F島的核電站,受9級(jí)特大地震影響舟铜,放射性物質(zhì)發(fā)生泄漏戈盈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一深滚、第九天 我趴在偏房一處隱蔽的房頂上張望奕谭。 院中可真熱鬧涣觉,春花似錦痴荐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膝宁,卻和暖如春鸦难,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背员淫。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工合蔽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人介返。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓拴事,卻偏偏與公主長得像,于是被迫代替她去往敵國和親圣蝎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刃宵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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