13. Java IO: InputStream

想要查看此教程的目錄請點擊:Java IO教程目錄貼地址


InputStream是Java IO中所有輸入流的基類握巢。它的子類包括FileInputStream,BufferedInputStream和PushbackInputStream等破衔。想要查看所有詳細的列表,請看“Java IO Overview”章節(jié)叹卷。

InputStreams and Sources

InputStream經(jīng)常被用來連接一些數(shù)據(jù)源抚太,例如文件,網(wǎng)絡(luò)連接营曼,管道等等乒验。查看更詳細的信息參考“Java IO Overview”章節(jié)

InputStream例子

它用來讀取字節(jié)數(shù)據(jù),每次讀取一個字節(jié)溶推。下面是一個相關(guān)例子:

nputStream inputstream = new FileInputStream("c:\\data\\input-text.txt");

int data = inputstream.read();
while(data != -1) {
  //do something with data...
  doSomethingWithData(data);

  data = inputstream.read();
}
inputstream.close();

這個例子中創(chuàng)建了一個FileInputStream實例徊件。FileInputStream是InputStream的子類所以它可以InputStream類型的變量。
注意:為了代碼清晰蒜危,這里并沒有考慮處理異常的情況虱痕。想學(xué)習(xí)更多可以看“Java IO Exception Handling”

Java7開始,你可以用try-with-resources去確保InputStream在使用后可以關(guān)閉辐赞。具體的用法可以參考上面Java異常處理的文章部翘,但是這里有一個例子:

try( InputStream inputstream = new FileInputStream("file.txt") ) {

    int data = inputstream.read();
    while(data != -1){
        System.out.print((char) data);
        data = inputstream.read();
    }
}

只要線程已經(jīng)執(zhí)行出try代碼塊,inputstream就會被關(guān)閉响委。

read()

InputStream的read()方法返回一個int類型的值新思,這個值是每次讀取的字節(jié)的值。下面是一個相關(guān)的例子:

int data = inputstream.read();

你也可以把int值強轉(zhuǎn)成為一個char類型的:

char aChar = (char) data;

InputStream的子類有可能擴展了read()方法赘风。例如夹囚,DataInputStream允許讀取java基本類型,像int邀窃、long荸哟、float、double瞬捕、boolean等等鞍历。當(dāng)然這些有相應(yīng)的方法,readBoolean()肪虎,readDouble()等等劣砍。

Stream的結(jié)束

如果read()方法返回 -1,就說明流到已經(jīng)全部讀取完畢扇救。這里的 -1 是int類型的刑枝,不是byte或short。這里是有些不同的迅腔!
當(dāng)流去讀完畢的時候仅讽,你可以關(guān)閉它了

read(byte[])

InputStream有兩個read()方法,參數(shù)是一個字節(jié)數(shù)組。這些方法是:

  • int read(byte[])
  • int read(byte[], int offset, int length)

每次讀取一個字節(jié)數(shù)組顯然要比每次讀取一個字節(jié)要快的多钾挟,所以只要有可能,你可以使用這類的方法來替代read()方法饱岸。

read(byte[])方法會讀取所有數(shù)據(jù)到數(shù)組中掺出。它會返回一個int值徽千,來告訴實際讀取的字節(jié)數(shù)。萬一實際讀取的字節(jié)數(shù)要比提供的字節(jié)少汤锨,那么字節(jié)數(shù)組的其余部分將包含與讀取開始之前所做的相同的數(shù)據(jù)双抽。要記住去檢查返回的int值,看實際取得的字節(jié)數(shù)有多少闲礼。
read(byte[], int offset, int length)方法也是讀數(shù)組到數(shù)組中牍汹,但是可以根據(jù)參數(shù)來規(guī)定開始的偏移量和一共讀取多少長度。返回值和read(byte[])方法的含義相同柬泽。

兩個方法相同的地方都是如果返回值是 -1 慎菲,代表讀取結(jié)束。

下面的例子為如何使用InputStream的read(byte[])方法:

InputStream inputstream = new FileInputStream("c:\\data\\input-text.txt");

byte[] data      = new byte[1024];
int    bytesRead = inputstream.read(data);

while(bytesRead != -1) {
  doSomethingWithData(data, bytesRead);

  bytesRead = inputstream.read(data);
}
inputstream.close();

首先锨并,上面代碼創(chuàng)建了一個字節(jié)數(shù)組露该。然后創(chuàng)建了一個叫bytesRead的int類型變量,去接受每次調(diào)用read(byte[])方法的返回值第煮。
在循環(huán)里解幼,doSomethingWithData()方法被循環(huán)調(diào)用,傳遞進去讀了多少字節(jié)和字節(jié)數(shù)組包警。在循環(huán)的最后把數(shù)據(jù)重新讀到數(shù)組一遍撵摆。

不用花太多精力放在研究怎么樣使用read(byte[], int offset, int length)方法來替換read(byte[])。你完全可以在任何時候用read(byte[], int offset, int length)替換掉read(byte[])方法害晦。

mark()和reset()

InputStream類中有兩個方法mark()和reset()特铝,但是它的子類不一定有支持(或者說子類有沒有重寫此方法)。

如果一個InputStream的子類支持這兩個方法篱瞎,子類會重寫markSupported()方法并返回 true苟呐。相反的,如果返回false俐筋,則子類不支持這兩個方法牵素。

mark()方法在InputStream設(shè)置一個內(nèi)部的標(biāo)記,標(biāo)記在流中哪個數(shù)據(jù)到目前為止已經(jīng)被讀取澄者。使用InputStream的代碼笆呆,可以根據(jù)這個標(biāo)記位來繼續(xù)讀取數(shù)據(jù)。

在讀取流的過程匯總粱挡,如果想退回到標(biāo)記的那點上赠幕,可以調(diào)用reset()方法。然后InputStream退回到標(biāo)記位上询筏,開始從這個位置開始返回數(shù)據(jù)榕堰。這當(dāng)然會導(dǎo)致多次返回一些數(shù)據(jù)

當(dāng)實現(xiàn)一個解析器時,會經(jīng)常用到這兩個方法。解析器讀取一個InputStream時會提前讀逆屡,如果解析器沒有找到它想要的圾旨,他可能需要回退并且將已讀數(shù)據(jù)和其他的數(shù)據(jù)進行匹配。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末魏蔗,一起剝皮案震驚了整個濱河市砍的,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莺治,老刑警劉巖廓鞠,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谣旁,居然都是意外死亡床佳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門蔓挖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夕土,“玉大人,你說我怎么就攤上這事瘟判≡剐澹” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵拷获,是天一觀的道長篮撑。 經(jīng)常有香客問我,道長匆瓜,這世上最難降的妖魔是什么赢笨? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮驮吱,結(jié)果婚禮上茧妒,老公的妹妹穿的比我還像新娘。我一直安慰自己左冬,他們只是感情好桐筏,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拇砰,像睡著了一般梅忌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上除破,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天牧氮,我揣著相機與錄音,去河邊找鬼瑰枫。 笑死踱葛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尸诽,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫉晶,長吁一口氣:“原來是場噩夢啊……” “哼幽崩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绢淀,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤土铺,失蹤者是張志新(化名)和其女友劉穎胶滋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悲敷,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡究恤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了后德。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片部宿。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瓢湃,靈堂內(nèi)的尸體忽然破棺而出理张,到底是詐尸還是另有隱情,我是刑警寧澤绵患,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布雾叭,位于F島的核電站,受9級特大地震影響落蝙,放射性物質(zhì)發(fā)生泄漏织狐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一筏勒、第九天 我趴在偏房一處隱蔽的房頂上張望移迫。 院中可真熱鬧,春花似錦管行、人聲如沸厨埋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揽咕。三九已至,卻和暖如春套菜,著一層夾襖步出監(jiān)牢的瞬間亲善,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工逗柴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛹头,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像渣蜗,于是被迫代替她去往敵國和親屠尊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

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

  • tags:io categories:總結(jié) date: 2017-03-28 22:49:50 不僅僅在JAVA領(lǐng)...
    行徑行閱讀 2,178評論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法耕拷,類相關(guān)的語法讼昆,內(nèi)部類的語法,繼承相關(guān)的語法骚烧,異常的語法浸赫,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 在經(jīng)過一次沒有準(zhǔn)備的面試后,發(fā)現(xiàn)自己雖然寫了兩年的android代碼赃绊,基礎(chǔ)知識卻忘的差不多了既峡。這是程序員的大忌,沒...
    猿來如癡閱讀 2,843評論 3 10
  • 摘要 Java I/O是Java技術(shù)體系中非潮滩椋基礎(chǔ)的部分运敢,它是學(xué)習(xí)Java NIO的基礎(chǔ)。而深入理解Java NI...
    biakia閱讀 7,600評論 7 81
  • 1.MRC與ARC混編,在seeting prase-> 加上-fno-objc-arc 2.建立cocopods...
    邵瓊閱讀 105評論 0 0