標籤:
簡介:java通過輸入和輸出資料流來進行資料轉送,這裡的“流”,應該說是“流處理器”更為恰當,它是一個類,封裝了對資料的操作細節。使得我們可以方便的進行資料轉送。在這裡有個“流源”和“流匯”的概念。資料就是從“流源”傳至“流匯”,對於輸入資料流,“流源”可以是磁碟,網路,記憶體等等,“流匯”是我們的程式。對於輸出資料流,“流源”是我們的程式,“流匯”是磁碟,網路,記憶體等等。java的InputStream和OutputStream對應,byte和char對應。byte類型的資料是InputStream和OutputStream操作的資料。char類型的資料是Reader和Writer操作的資料(Reader和Writer是為了支援國際化),應當儘可能去用Reader和Writer當這兩個流處理器不能滿足需求時才用InputStream和OutputStream(例如視頻檔案的處理)。UML類圖:
說明:對於InputStream還有幾個不怎麼能用到,或已經不推薦使用的流我沒有放到圖片中,除此,InputStream和OutputStream幾乎完全對應,OutputStream中多了個PrintStream用于格式化列印。
因為這裡完美對應,所以我只解釋輸入資料流和PrintWriter,最後會展示它們的使用代碼。
(1)ByteArrayInputStream可以用於多線程的通訊來提供緩衝功能(這裡說緩衝是指它會維護一個記憶體中的Byte數組),所以它的"流源"就是記憶體中的數組,"流匯"當然是應用程式。
(2)FileInputStream建立一個與檔案有關的輸入資料流,用來讀取檔案資料。它的“流源”是硬碟上的一個檔案,建立時通過File對象或者表示檔案位置的URL來指明“流源”的位置。“流匯”是應用程式。
(3)PipedInputStream與PipedOutputStream配合使用,用於讀入資料管道的資料。“流源”的物理位置依然是記憶體,通過PipedOutputStream來指明。“流匯”應用程式。
(4)ObjectInputStream將ObjectOutputStream序列化的資料並行化,並行化就是將位元據轉化為Object類型資料,序列化就是將Object類型的資料轉化為位元據。“流源”可以是記憶體,可以是網路,“流匯”是應用程式。
(5)FilterInputStream比較特殊,它的角色是設計模式中裝飾模式中的裝飾者,不熟悉設計模式的可以去看設計模式。它是一個抽象類別,不能直接建立對象。它規範了實現它的子類(即BufferedInputStream和DataInputStream)如何對前面四種的流進行裝飾,這裡很重要的一點是FilterInputStream會強制子類調用被裝飾對象的特定方法。這裡的裝飾,就是在加強被裝飾對象的功能,也就是前四種流對象的功能。
(6)DataInputStream繼承了FilterInputStream就是一個具體的裝飾類,建立它時需要傳入前四種流類型的對象,或者另外一個繼承了FilterInputStream的BufferedInputStream可以將由前集中流擷取的資料解釋為java的八種基本類型的資料,例如int,char等。
(7)BufferedInputStream會在記憶體中建立一個緩衝區(所謂的緩衝區就是程式申請分配的一段記憶體位址,例如建立了一個數組,這個數組就可以充當一個記憶體緩衝區)將由前四種對象讀取的資料進行緩衝。
//臨時有事,後面的內容將於晚上補全
Java I/O