Java學習之i/o系統

來源:互聯網
上載者:User

標籤: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系統

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.