標籤:code 參考 單元 裝飾器 實現 lsp 也有 out 開啟檔案
1 Java IO版本
Java庫的IO分為輸入/輸出兩部分。
早期的Java 1.0版本的輸入系統是InputStream及其子類,輸出系統是OutputStream及其子類。
後來的Java 1.1版本對IO系統進行了重新設計。輸入系統是Reader及其子類,輸出系統是Writer及其子類。
Java1.1之所以要重新設計,主要是為了添加國際化支援(即添加了對16位Unicode碼的支援)。具體表現為Java 1.0的IO系統是位元組流,而Java 1.1的IO系統是字元流。
位元組流,就是資料流中最小的資料單元是8位的位元組。
字元流,就是資料流中最小的資料單元是16位的字元。
位元組流在操作的時候,不會用到緩衝;而字元流會用到緩衝。所以,字元流的效率會更高一些。
至於為什麼用到緩衝會效率更高一些呢?那是因為,緩衝本質上是一段記憶體地區;而檔案大多是儲存在硬碟或者Nand Flash上面。讀寫記憶體的速度比讀寫硬碟或Nand Flash上檔案的速度快很多!
目前,檔案大多以位元組的方式儲存的。所以在開發中,位元組流使用較為廣泛。
2 Java 1.0和Java 1.1 的IO類的比較
表01_Java 1.0和Java 1.1的IO基本類對比表
Java 1.0 IO基本類(位元組流) |
Java 1.1 IO基本類(字元流) |
InputStream |
Reader |
OutputStream |
Writer |
FileInputStream |
FileReader |
FileOutputStream |
FileWriter |
StringBufferInputStream |
StringReader |
無 |
StringWriter |
ByteArrayInputStream |
CharArrayReader |
ByteArrayOutputStream |
CharArrayWriter |
PipedInputStream |
PipedReader |
PipedOutputStream |
PipedWriter |
表02_Java 1.0和Java 1.1的IO裝飾器對比表
Java 1.0 IO裝飾器(位元組流) |
Java 1.1 IO裝飾器(字元流) |
FilterInputStream |
FilterReader |
FilterOutputStream |
FilterWriter(沒有子類的抽象類別) |
BufferedInputStream |
BufferedReader(也有 readLine()) |
BufferedOutputStream |
BufferedWriter |
DataInputStream |
無 |
PrintStream |
PrintWriter |
LineNumberInputStream |
LineNumberReader |
StreamTokenizer |
|
PushBackInputStream |
PushBackReader |
之所以將Java IO系統分為基本類和裝飾器,是因為基本類主要是將流分為檔案、字串等不同種類,而裝飾器是為了實現“Decorator模式”(參考 “4 Decorator模式”)。
3 Java 1.0 IO系統介紹
因為Java 1.0與Java 1.1的IO系統的原理和使用方法都相似。所以,下面主要對Java 1.0的IO系統進行說明。
3.1輸入資料流
InputStream是位元組輸入資料流的所有類的超類,它主要包括以下幾個常用的子類。
(01)ByteArrayInputStream
將Byte數組作為位元組數組輸入資料流使用。
(02)StringBufferInputStream
將字串作為字串輸入資料流使用。已淘汰,不建議使用。
(03)FileInputStream
將檔案或FileDescriptor作為檔案輸入資料流使用。建立該輸入資料流時,傳遞的參數可以是“檔案名稱”(String類型)、“File對象”或“FileDescriptor對象”(即可以是標準輸入資料流、輸出資料流、錯誤流的控制代碼)。
(04)PipedInputString
提供要寫入管道輸出資料流的所有資料位元組。建立該輸入資料流的時候,可以指定對應的管道輸出輪流;這樣做的話,意味著將對應的管道輸入資料流串連到了管道輸出資料流。
(05)FilterInputStream
它直接繼承與InputStream,主要用於實現Decorator模式(這在後面進行說明)。
FilterInputStream主要有兩個衍生類別“DataInputStream”和“BufferedInputStream”。DataInputStream提供了讀取byte、char、int等基本類型和String的各種介面;BufferedInputStream提供了緩衝功能。
3.2輸出資料流
OutputStream是位元組輸出資料流的所有類的超類,它主要包括以下幾個常用的子類。
(01)ByteArrayOutputStream
位元組數組輸出資料流,其中的資料被寫入一個 byte 數組。緩衝區會隨著資料的不斷寫入而自動成長。可使用 toByteArray() 和 toString() 擷取資料。
(02)FileOutputStream
檔案輸出資料流是用於將資料寫入 File 或 FileDescriptor 的輸出資料流。
檔案是否可用或能否可以被建立取決於基礎平台。特別是某些平台一次只允許一個 FileOutputStream(或其他檔案寫入對象)開啟檔案進行寫入。在這種情況下,如果所涉及的檔案已經開啟,則此類中的構造方法將失敗。
(03)PipedOutputString
可以將管道輸出資料流串連到管道輸入資料流來建立通訊管道。管道輸出資料流是管道的發送端。通常,資料由某個線程寫入 PipedOutputStream 對象,並由其他線程從串連的 PipedInputStream讀取。
不建議對這兩個對象嘗試使用單個線程,因為這樣可能會造成該線程死結。如果某個線程正從串連的管道輸入資料流中讀取資料位元組,但該線程不再處於活動狀態,則該管道被視為處於 毀壞 狀態。
(04)FilterOutputStream
它直接繼承與OutputStream,主要用於實現Decorator模式(這在後面進行說明)。
FilterOutputStream主要有兩個衍生類別“DataOutputStream”和“BufferedOutputStream”。DataOutputStream提供了寫入byte、char、int等基本類型和String的各種介面;BufferedOutputStream提供了緩衝功能。
Java學習之i/o系統