想要查看此教程的目錄請點擊:Java IO教程目錄貼地址
Java IO API中,OutputStream是所有輸出流的基類。子類包括BufferedOutputStream,F(xiàn)ileOutputStream等等。想要了解所有的流相關的清單,請看“Java IO Overview”章節(jié)
OutputStream介紹和數(shù)據(jù)目的地
OutputStream經(jīng)常用來連接到數(shù)據(jù)目的地,比如文件,網(wǎng)絡連接,管道等等。OutputStream將所有數(shù)據(jù)的數(shù)據(jù)寫入目的地后即結束。
write(byte)
write(byte)方法用來向流中寫入單個字節(jié)。參數(shù)為int類型,也就是準備寫出的數(shù)據(jù)。只有int值的第一個字節(jié)會被寫入。其余的都會被忽略。
OutputStream的子類可以有更多write()方法。例如,DataOutputStream可以寫java基礎類型如int,long,float,double,boolean等。相對應的方法writeBoolean(),writeDouble()等
下面是OutputStream的write()例子:
OutputStream output = new FileOutputStream("c:\\data\\output-text.txt");
while(hasMoreData()) {
int data = getMoreData();
output.write(data);
}
output.close();
這個例子首先創(chuàng)建了一個FileOutputStream去獲取要讀的數(shù)據(jù)文件。然后進入一個循環(huán),循環(huán)的條件是有數(shù)據(jù),這只是一個偽代碼,并沒有去展示怎么確定有數(shù)據(jù)。
在循環(huán)里,調用了方法getMoreData()去獲取下一次要往OutputStream寫的數(shù)據(jù),然后寫入數(shù)據(jù)。
write(byte[])
OutputStream也有write(byte[] bytes)方法和write(byte[] bytes, int offset, int length)方法,這兩個都是寫入一個或部分數(shù)組內的字節(jié)到OutputStream。
write(byte[] bytes)方法是將數(shù)組內所有數(shù)據(jù)寫入到OutputStream。而write(byte[] bytes, int offset, int length)可以規(guī)定從哪里開始寫,一共寫多少長度的數(shù)據(jù)。
flush()
OutputStream的flush()方法刷新所有已經(jīng)寫入OutputStream的數(shù)據(jù)到數(shù)據(jù)目的地。例如,如果OutputStream是一個FileOutputStream的話,寫入FileOutputStream的的字節(jié)可能并沒有全部被寫入到磁盤,他們可能在內存緩沖區(qū)里,雖然你的Java代碼已經(jīng)將數(shù)據(jù)寫入到FileOutputStream,但是通過flush()方法,你可以確保數(shù)據(jù)都已經(jīng)寫到磁盤(網(wǎng)絡連接或其他的數(shù)據(jù)目標地)
close()
當你往OutputStream寫完數(shù)據(jù)的時候你會去關閉掉流,那么就要利用close()方法。由于OutputStream各式的寫入方法可能會拋出IOException,那么你就要在finally代碼塊中來關閉流。下面是一個關閉流的例子:
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();
}
}
這個例子是在finally中調用close()方法,確保流被關閉。但是它依然沒有完美解決異常問題。但是我已經(jīng)在“Java IO異常處理”章節(jié)說明了這個問題的解決辦法。