想要查看此教程的目錄請(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è)問題的解決辦法。