Java Streams概述一

流是有序的數(shù)據(jù)序列,它...

  • 提供通用的I / O模型
  • 從底層源或目標(biāo)中提取詳細(xì)信息

無(wú)論您使用流從內(nèi)存畏邢,存儲(chǔ)或網(wǎng)絡(luò)中獲取數(shù)據(jù)慈缔,它都將對(duì)您隱藏實(shí)現(xiàn)細(xì)節(jié)。詳細(xì)信息被抽象掉了琼锋,因此在每種情況下放闺,您都可以將其視為數(shù)據(jù)的有序序列。

  • 流類型是單向的

這意味著缕坎,如果創(chuàng)建Java流的實(shí)例怖侦,則可以決定是要寫入Java實(shí)例還是從中讀取。您不能在給定的時(shí)間同時(shí)在單個(gè)流上同時(shí)執(zhí)行這兩項(xiàng)操作谜叹。

我們可以將流分為兩類:

  • 字節(jié)流–作為二進(jìn)制數(shù)據(jù)進(jìn)行交互
  • 文本流–作為Unicode字符進(jìn)行交互

兩種Java流類型的常規(guī)交互是相同的

用流閱讀

正如我們提到的匾寝,每個(gè)流都用于讀取或?qū)懭搿?/span>

首先,讓我們看看如何從Java流中讀取數(shù)據(jù)荷腊。

在Java中讀取二進(jìn)制數(shù)據(jù)的基類是艳悔。 讀取文本數(shù)據(jù)的基類稱為 類。 InputStreamReader

這兩個(gè)類幾乎具有相同的兩種方法:

  • int read()
  • int read(byte/char[] buff)

請(qǐng)注意女仰,在兩種情況下猜年,它們都返回一個(gè) Integer 值。這些是解釋值疾忍。整數(shù)是一個(gè)32位容器乔外,因此在兩種情況下都可以使用。

兩者之間的區(qū)別:

    • 這個(gè)InputStream與字節(jié)一起工作一罩,字節(jié)是8位杨幼。
    • 這個(gè)Reader適用于unicode字符,即16位。

使用InputStream讀取字節(jié)

InputStream input = // create input stream
int result;

while(result = input.read() >= 0) //Indicates the end-of-stream with a return value of -1
byte byteVal = (byte)result;
// do something with byteVal
};

用閱讀器閱讀文字

Reader reader = // create reader
int result;

while(result = reader.read() >= 0)//Indicates the end-of-stream with a return value of -1
char charVal = (char)result;
// do something with charVal
};

請(qǐng)注意差购,如果您想檢索該值四瘫,則只需將結(jié)果轉(zhuǎn)換為適當(dāng)?shù)念愋?在這種情況下為 bytechar

用流寫

為了寫入數(shù)據(jù)欲逃,有兩個(gè)基類類似于讀流找蜜。

  • OutputStream(對(duì)于字節(jié))
  • Writer (用于文本)

用Java流寫比讀它們更簡(jiǎn)單。兩個(gè)類都有一些write方法void return類型

使用OutputStream寫入字節(jié)

寫作OutputStream暖夭,可以將單個(gè)字節(jié)傳遞給方法锹杈,也可以傳遞字節(jié)數(shù)組。

OutputStream output // create output stream;
Byte byteVal = 100;

output.write(byteVal);

byte[] byteBuff = {0, 10, 20};
output.write(byteBuff);

用Writer寫

Writer你可以傳遞一個(gè)簡(jiǎn)單的字符串迈着,或者一個(gè)字符串類write方法

Writer writer // create output stream;
char charVal = 'c';

writer.write(charVal);

char[] charArray = {'c', 'h', 'a', 'r'};
writer.write(charArray);

String stringVal = "String";
writer.write(stringVal);

正如您所看到的竭望,您需要編寫的代碼比閱讀的代碼少得多。

常見(jiàn)Java流類

上面裕菠,寫了有關(guān)基本流類的文章∫澹現(xiàn)在更深入地討論不同的實(shí)現(xiàn)。

常見(jiàn)的Input / OutputStream派生類

  • ByteArrayInputStream / ByteArrayOutputStream 能夠在字節(jié)數(shù)組上創(chuàng)建流
  • PipedInputStream / PipedOutputStream –這很像生產(chǎn)者-消費(fèi)者的概念奴潘。管道輸出流可以連接到管道輸入流以創(chuàng)建通信管道旧烧。管道輸出流是管道的發(fā)送端。通常画髓,數(shù)據(jù)是PipedOutputStream通過(guò)一個(gè)線程寫入對(duì)象的掘剪,而數(shù)據(jù)是PipedInputStream通過(guò)其他線程從連接的對(duì)象讀取的。
  • FileInputStream / FileOutputStream –這些允許在文件上創(chuàng)建流奈虾。

常見(jiàn)讀/寫實(shí)現(xiàn)

上面是Reader / Writer流實(shí)現(xiàn)的示例夺谁。

  • CharArrayReader / Writer 允許在字符上創(chuàng)建流
  • StringReader / Writer 允許通過(guò)字符串創(chuàng)建流。
  • PipedReader / Writer 允許以文本的生產(chǎn)者/消費(fèi)者關(guān)系創(chuàng)建流肉微。類似于 PipedOutput / InputStream
  • InputStreamReader / Writer 允許通過(guò)Input / OutputStream創(chuàng)建流匾鸥。
  • FileReader / Writer 能夠在文本文件上進(jìn)行流傳輸。

流式錯(cuò)誤和清理

到目前為止碉纳,我們已經(jīng)了解了streams的一般特性勿负,但還沒(méi)有考慮到與它們一起工作的所有實(shí)際情況。

Stream Realities

清理

  • 流由物理存儲(chǔ)支持劳曹,物理存儲(chǔ)通常存在于Java運(yùn)行時(shí)之外奴愉,例如文件或網(wǎng)絡(luò)連接。
  • 因此铁孵,Java可能無(wú)法可靠地清除锭硼,因此我們需要進(jìn)行可靠的清除。完成處理后库菲,我們需要關(guān)閉Streams。

解決

  • Streams實(shí)現(xiàn)Closeable接口志膀,它實(shí)現(xiàn)一個(gè)單一的close方法熙宇。所以鳖擒,這是我們的責(zé)任。

讓我們看看一個(gè)簡(jiǎn)單的解決方案:

Reader reader; 
try{
reader = // create output stream;
// do something with reader;
}catch (IOException e) {
//handle exception
}finally {
if(reader != null)
reader.close();
}

上面這個(gè)例子的問(wèn)題是您總是需要實(shí)現(xiàn)它烫止。通常蒋荚,我們經(jīng)常使用流,所以應(yīng)該自動(dòng)完成馆蠕。讓我們看看怎樣才能實(shí)現(xiàn)期升。

自動(dòng)清理

 AutoClosable接口:
		1、一種方法:關(guān)閉
		2互躬、接口的基本接口 Closable 播赁,因此每個(gè)Stream都支持它。
		3吼渡、為嘗試資源提供支持

Try-With-Resources

1容为、自動(dòng)清理一個(gè)或多個(gè)資源“資源”是可以實(shí)現(xiàn)的任何類型??
2、AutoClosable語(yǔ)法類似于傳統(tǒng)的try語(yǔ)句
3寺酪、(可選)包括捕獲塊處理身體處理關(guān)閉方法調(diào)用

使用嘗試資源

在這里坎背,我提供了一個(gè)簡(jiǎn)單的示例,說(shuō)明如何通過(guò)try-with-resources塊使用流的自動(dòng)關(guān)閉寄雀。

我將通過(guò)來(lái)使用它 FileInputStream得滤。稍后我們將討論這個(gè)特定的流。

使用Try-With-Resources

在這里盒犹,我提供了一個(gè)簡(jiǎn)單的示例懂更,說(shuō)明如何通過(guò)try-with-resources塊使用流的自動(dòng)關(guān)閉。

我將通過(guò)來(lái)使用它 FileInputStream阿趁。稍后我們將討論這個(gè)特定的流膜蛔。

try(FileInputStream input = new FileInputStream("file1.txt")) {

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

用上述方法,無(wú)需研究進(jìn)一步的工作即可關(guān)閉流脖阵。

概括

在本文中皂股,介紹了Java流的基礎(chǔ)知識(shí),它們是什么命黔,它們?nèi)绾喂ぷ饕约叭绾问褂盟鼈儭?/span>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呜呐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子悍募,更是在濱河造成了極大的恐慌蘑辑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坠宴,死亡現(xiàn)場(chǎng)離奇詭異洋魂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門副砍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)衔肢,“玉大人,你說(shuō)我怎么就攤上這事豁翎〗侵瑁” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵心剥,是天一觀的道長(zhǎng)邦尊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)优烧,這世上最難降的妖魔是什么蝉揍? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮匙隔,結(jié)果婚禮上疑苫,老公的妹妹穿的比我還像新娘。我一直安慰自己纷责,他們只是感情好捍掺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著再膳,像睡著了一般挺勿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喂柒,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天不瓶,我揣著相機(jī)與錄音,去河邊找鬼灾杰。 笑死蚊丐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艳吠。 我是一名探鬼主播麦备,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昭娩!你這毒婦竟也來(lái)了凛篙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤栏渺,失蹤者是張志新(化名)和其女友劉穎呛梆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磕诊,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡填物,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年纹腌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滞磺。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壶笼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雁刷,到底是詐尸還是另有隱情,我是刑警寧澤保礼,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布沛励,位于F島的核電站,受9級(jí)特大地震影響炮障,放射性物質(zhì)發(fā)生泄漏目派。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一胁赢、第九天 我趴在偏房一處隱蔽的房頂上張望企蹭。 院中可真熱鬧,春花似錦智末、人聲如沸谅摄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)送漠。三九已至,卻和暖如春由蘑,著一層夾襖步出監(jiān)牢的瞬間闽寡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工尼酿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爷狈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像帖渠,于是被迫代替她去往敵國(guó)和親晒来。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 鏈流 在使用流時(shí)土辩,它們通常被鏈接在一起。 讓我們看看使用鏈接流的優(yōu)點(diǎn)是什么: 一個(gè)流實(shí)例利用另一個(gè)流實(shí)例抢野。 這將創(chuàng)...
    假程序員櫻木閱讀 224評(píng)論 0 0
  • I/O類庫(kù)中使用“流”這個(gè)抽象概念拷淘。Java對(duì)設(shè)備中數(shù)據(jù)的操作是通過(guò)流的方式。表示任何有能力產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源對(duì)象指孤,...
    千淘萬(wàn)漉閱讀 7,328評(píng)論 0 2
  • 《java世界觀》文集說(shuō)明 本文集記載的所有內(nèi)容均是java的學(xué)習(xí)筆記启涯,主要重點(diǎn)記錄概念贬堵,可能不會(huì)為每個(gè)概念列舉完...
    蝸先生閱讀 141評(píng)論 0 0
  • 六、極客時(shí)間 1结洼、Exception和Error有什么區(qū)別黎做? Error類和Exception類的父類都是thro...
    想54256閱讀 774評(píng)論 0 1
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭松忍,有人歡樂(lè)有人憂愁蒸殿,有人驚喜有人失落,有的覺(jué)得收獲滿滿有...
    陌忘宇閱讀 8,536評(píng)論 28 53