2008年10月31日 星期五

[Java][O'REILLY] Java I/O技術(note) - part1

Java的大部分I/O形式分兩種:

1.byte & number,由輸入輸出的stream處理。
2.character 與 text,由readerwriter 處理。
stream:
是一連串又順序,但長度尚未判斷出來的位元組。

input stream:

把位元組從某個一般性的外界來源搬進Java程式。

output stream:

把位元組從Java程式內部搬到某一般性的外部目標,在某些情況下,串流能把位元組從Java程式的某部分搬到另一部分。

flush():

一般來說,緩衝區未滿之前,資料是不會被送出去,但如果你希望對方能儘快收到資料(或其他原因),可以呼叫flush()強制出清緩衝區,不管緩衝區是否滿了。
請注意,flush()並不會出清作業系統或硬體的緩衝區。輸出串流的緩衝區,與硬體或OS的緩衝區是兩回事。若要出清這類緩衝區,可以考慮使用FileDescriptor類別的sync()。

除非有特殊用意,否則我們不會刻意出清緩衝區。因為當串流關閉時,緩衝區內的的資料會被自動寫到目的地,串流會在程式結束時,或你使用close()方法時被關閉。


什麼時候會用到flush():

1.若你的程式大打算透過網路傳送一堆資料,你應該週期性的出清緩衝區,確定資料已經送出。
2.在出錯一個會當掉的程式時。照理說,所有輸出串流在緩衝區被填滿時會自動出清,這是在程式能正常結束的前提下,這沒有問題。但如果程式不正常結束,則緩衝區就會殘留資料。此時除非每次寫入資料後去可以呼叫flush(),否則就無法依據輸出的資料來判斷程式當掉的地方,因為程式可能出錯之後繼續執行一段時間。
3.System.out、System.err和某些列印串流(print stream),在每次呼叫println()之後,以及每次寫入的字串遇到'\n'換行字元之後,緩衝區會被自動出清。你可以在PrintStream建構式中,設定是否啟動自動出清。

system.out:

system.out是printStream的實體,若你在關閉system.out之後試圖寫入它,他並不會對出IOException,只不過要寫的東西不會出現吧了。這是因為system.out的使用率太頻繁,因此Sun決定讓它吃掉所有IOException,免得每次都要用try/catch包著它。因此在所有串流中System.out算是一種特例。

沒有留言:

張貼留言