14. Java IO: OutputStream

想要查看此教程的目錄請(qǐng)點(diǎn)擊:Java IO教程目錄貼地址


Java IO API中,OutputStream是所有輸出流的基類。子類包括BufferedOutputStream,F(xiàn)ileOutputStream等等。想要了解所有的流相關(guān)的清單,請(qǐng)看“Java IO Overview”章節(jié)

OutputStream介紹和數(shù)據(jù)目的地

OutputStream經(jīng)常用來連接到數(shù)據(jù)目的地,比如文件,網(wǎng)絡(luò)連接,管道等等。OutputStream將所有數(shù)據(jù)的數(shù)據(jù)寫入目的地后即結(jié)束。

write(byte)

write(byte)方法用來向流中寫入單個(gè)字節(jié)。參數(shù)為int類型,也就是準(zhǔn)備寫出的數(shù)據(jù)。只有int值的第一個(gè)字節(jié)會(huì)被寫入。其余的都會(huì)被忽略。

OutputStream的子類可以有更多write()方法。例如,DataOutputStream可以寫java基礎(chǔ)類型如int,long,float,double,boolean等。相對(duì)應(yīng)的方法writeBoolean(),writeDouble()等

下面是OutputStream的write()例子:

OutputStream output = new FileOutputStream("c:\\data\\output-text.txt");

while(hasMoreData()) {
  int data = getMoreData();
  output.write(data);
}
output.close();

這個(gè)例子首先創(chuàng)建了一個(gè)FileOutputStream去獲取要讀的數(shù)據(jù)文件。然后進(jìn)入一個(gè)循環(huán),循環(huán)的條件是有數(shù)據(jù),這只是一個(gè)偽代碼,并沒有去展示怎么確定有數(shù)據(jù)。

在循環(huán)里,調(diào)用了方法getMoreData()去獲取下一次要往OutputStream寫的數(shù)據(jù),然后寫入數(shù)據(jù)。

write(byte[])

OutputStream也有write(byte[] bytes)方法和write(byte[] bytes, int offset, int length)方法,這兩個(gè)都是寫入一個(gè)或部分?jǐn)?shù)組內(nèi)的字節(jié)到OutputStream。

write(byte[] bytes)方法是將數(shù)組內(nèi)所有數(shù)據(jù)寫入到OutputStream。而write(byte[] bytes, int offset, int length)可以規(guī)定從哪里開始寫,一共寫多少長度的數(shù)據(jù)。

flush()

OutputStream的flush()方法刷新所有已經(jīng)寫入OutputStream的數(shù)據(jù)到數(shù)據(jù)目的地。例如,如果OutputStream是一個(gè)FileOutputStream的話,寫入FileOutputStream的的字節(jié)可能并沒有全部被寫入到磁盤,他們可能在內(nèi)存緩沖區(qū)里,雖然你的Java代碼已經(jīng)將數(shù)據(jù)寫入到FileOutputStream,但是通過flush()方法,你可以確保數(shù)據(jù)都已經(jīng)寫到磁盤(網(wǎng)絡(luò)連接或其他的數(shù)據(jù)目標(biāo)地)

close()

當(dāng)你往OutputStream寫完數(shù)據(jù)的時(shí)候你會(huì)去關(guān)閉掉流,那么就要利用close()方法。由于OutputStream各式的寫入方法可能會(huì)拋出IOException,那么你就要在finally代碼塊中來關(guān)閉流。下面是一個(gè)關(guān)閉流的例子:

OutputStream output = null;

try{
  output = new FileOutputStream("c:\\data\\output-text.txt");

  while(hasMoreData()) {
    int data = getMoreData();
    output.write(data);
  }
} finally {
    if(output != null) {
        output.close();
    }
}

這個(gè)例子是在finally中調(diào)用close()方法,確保流被關(guān)閉。但是它依然沒有完美解決異常問題。但是我已經(jīng)在“Java IO異常處理”章節(jié)說明了這個(gè)問題的解決辦法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、流的概念和作用。 流是一種有順序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合,是對(duì)數(shù)據(jù)傳輸?shù)目偝苫虺橄?。即?shù)據(jù)在兩設(shè)備之間的傳輸...
    布魯斯不吐絲閱讀 10,319評(píng)論 2 95
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評(píng)論 18 399
  • 參考博文: 多態(tài)?? 多態(tài)就是父類指針指向子類對(duì)象 例如: 自定義按鈕的時(shí)候想改變按鈕內(nèi)部的圖片和文字的位置,這個(gè)時(shí)...
    Dayu大魚閱讀 164評(píng)論 0 0
  • 今天終于恢復(fù)平時(shí)的運(yùn)動(dòng)練習(xí)了,不容易,這是一場(chǎng)心靈的對(duì)抗賽,心里就是兩個(gè)小人一直掐架。 懶惰小人說:“休息,休息一...
    如恒閱讀 251評(píng)論 0 0
  • 汪溝小子閱讀 300評(píng)論 0 3

友情鏈接更多精彩內(nèi)容