Java IO

IO中的輸入字節流

   下面是IO中輸入字節流的繼承圖。

o InputStream
o ByteArrayInputStream
o FileInputStream
o FilterInputStream
o BufferedInputStream
o DataInputStream
o LineNumberInputStream
o PushbackInputStream
o ObjectInputStream
o PipedInputStream
o SequenceInputStream
o StringBufferInputStream

在上面的關係圖中可以看出:

1、InputStream是所有的輸入字節流的父類,它是一個抽象類。

2、ByteArrayInputStream、StringBufferInputStream、FileInputStream是三種基本的介質流,它們分別將Byte數組、StringBuffer、和本地文件中讀取數據。PipedInputStream是從與其它線程共用的管道中讀取數據,與Piped相關的知識會用專門的一小節講解。

3、 ObjectInputStream和所有FilterInputStream的子類都是裝飾流(裝飾器模式的主角)。下表列出了這些流的功能及如何使用它們(具體使用在講解完裝飾器模式後會舉幾個例子)。

基本輸入字節流:

ByteArrayInputStream
將內存中的Byte數組適配爲一個InputStream。
從內存中的Byte數組創建該對象(2種方法)
一般作爲數據源,會使用其它裝飾流提供額外的功能,一般都建議加個緩衝功能。

StringBufferInputStream
將內存中的字符串適配爲一個InputStream。
從一個String對象創建該對象。底層的實現使用StringBuffer。該類被Deprecated。主要原因是StringBuffer不應該屬於字節流,所以推薦使用StringReader。
一般作爲數據源,同樣會使用其它裝飾器提供額外的功能。

FileInputStream
最基本的文件輸入流。主要用於從文件中讀取信息。
通過一個代表文件路徑的 String、File對象或者 FileDescriptor對象創建。
一般作爲數據源,同樣會使用其它裝飾器提供額外的功能。

PipedInputStream
讀取從對應PipedOutputStream寫入的數據。在流中實現了管道的概念。
利用對應的PipedOutputStream創建。
在多線程程序中作爲數據源,同樣會使用其它裝飾器提供額外的功能。

SequenceInputStream
將2個或者多個InputStream 對象轉變爲一個InputStream.
使用兩個InputStream 或者內部對象爲InputStream 的Enumeration對象創建該對象。
一般作爲數據源,同樣會使用其它裝飾器提供額外的功能。

FilterInputStream
給其它被裝飾對象提供額外功能的抽象類 主要子類見下表

DataInputStream
一般和DataOutputStream配對使用,完成基本數據類型的讀寫。
利用一個InputStream構造。
提供了大量的讀取基本數據類新的讀取方法。

BufferedInputStream
使用該對象阻止每次讀取一個字節都會頻繁操作IO。將字節讀取一個緩存區,從緩存區讀取。
利用一個InputStream、或者帶上一個自定義的緩存區的大小構造。
使用InputStream的方法讀取,只是背後多一個緩存的功能。設計模式中透明裝飾器的應用。

LineNumberInputStream
跟蹤輸入流中的行號。可以調用getLineNumber( )和 setLineNumber(int)方法得到和設置行號。
利用一個InputStream構造。
緊緊增加一個行號。可以象使用其它InputStream一樣使用。

PushbackInputStream
可以在讀取最後一個byte 後將其放回到緩存中。
利用一個InputStream構造。
一般僅僅會在設計compiler的scanner 時會用到這個類。在我們的java語言的編譯器中使用它。很多程序員可能一輩子都不需要。

**

IO中的輸出字節流

**
下面是IO中輸出字節流的繼承圖。

OutputStream
ByteArrayOutputStream
FileOutputStream
FilterOutputStream
BufferedOutputStream
DataOutputStream
PrintStream
ObjectOutputStream
PipedOutputStream

在上面的關係圖中可以看出:
1、OutputStream是所有的輸出字節流的父類,它是一個抽象類。
2、ByteArrayOutputStream、FileOutputStream是兩種基本的介質流,它們分別向Byte數組、和本地文件中寫入數據。PipedOutputStream是向與其它線程共用的管道中寫入數據,
3、ObjectOutputStream和所有FilterOutputStream的子類都是裝飾流。下表列出了輸出字節流的功能及如何使用它們。

ByteArrayOutputStream
在內存中創建一個buffer。所有寫入此流中的數據都被放入到此buffer中。
無參或者使用一個可選的初始化buffer的大小的參數構造。
一般將其和FilterOutputStream套接得到額外的功能。建議首先和BufferedOutputStream套接實現緩衝功能。通過toByteArray方法可以得到流中的數據。(不通明裝飾器的用法)

FileOutputStream
將信息寫入文件中。
使用代表文件路徑的String、File對象或者 FileDescriptor對象創建。還可以加一個代表寫入的方式是否爲append的標記。
一般將其和FilterOutputStream套接得到額外的功能。

PipedOutputStream
任何寫入此對象的信息都被放入對應PipedInputStream 對象的緩存中,從而完成線程的通信,實現了“管道”的概念。具體在後面詳細講解。
利用PipedInputStream構造
在多線程程序中數據的目的地的。一般將其和FilterOutputStream套接得到額外的功能。

FilterOutputStream
實現裝飾器功能的抽象類。爲其它OutputStream對象增加額外的功能。

DataOutputStream
通常和DataInputStream配合使用,使用它可以寫入基本數據類新。
使用OutputStream構造
包含大量的寫入基本數據類型的方法。

PrintStream
產生具有格式的輸出信息。(一般地在java程序中DataOutputStream用於數據的存儲,即J2EE中持久層完成的功能,PrintStream完成顯示的功能,類似於J2EE中表現層的功能)
使用OutputStream和一個可選的表示緩存是否在每次換行時是否flush的標記構造。還提供很多和文件相關的構造方法。
一般是一個終極(“final”)的包裝器,很多時候我們都使用它!

BufferedOutputStream
使用它可以避免頻繁地向IO寫入數據,數據一般都寫入一個緩存區,在調用flush方法後會清空緩存、一次完成數據的寫入。
從一個OutputStream或者和一個代表緩存區大小的可選參數構造。
提供和其它OutputStream一致的接口,只是內部提供一個緩存的功能。

**

字節流的輸入與輸出的對應

**
字節流的輸入與輸出的對應

**

IO中的輸入字符流

**
下面是IO中輸入字符流的繼承圖。

Reader
BufferedReader
LineNumberReader
CharArrayReader
FilterReader
PushbackReader
InputStreamReader
FileReader
PipedReader
StringReader

在上面的關係圖中可以看出:
1、Reader是所有的輸入字符流的父類,它是一個抽象類。
2、CharReader、StringReader是兩種基本的介質流,它們分別將Char數組、String中讀取數據。PipedReader是從與其它線程共用的管道中讀取數據。
3、BufferedReader很明顯就是一個裝飾器,它和其子類負責裝飾其它Reader對象。
4、FilterReader是所有自定義具體裝飾流的父類,其子類PushbackReader對Reader對象進行裝飾,會增加一個行號。
5、InputStreamReader是一個連接字節流和字符流的橋樑,它將字節流轉變爲字符流。FileReader可以說是一個達到此功能、常用的工具類,在其源代碼中明顯使用了將FileInputStream轉變爲Reader的方法。我們可以從這個類中得到一定的技巧。

**

IO中的輸出字符流

**
下面是IO中輸出字符流的繼承圖。

Writer
BufferedWriter
CharArrayWriter
FilterWriter
OutputStreamWriter
FileWriter
PipedWriter
PrintWriter
StringWriter
在上面的關係圖中可以看出:
1、Writer是所有的輸出字符流的父類,它是一個抽象類。
2、CharArrayWriter、StringWriter是兩種基本的介質流,它們分別向Char數組、String中寫入數據。PipedWriter是向與其它線程共用的管道中寫入數據,
3、BufferedWriter是一個裝飾器爲Writer提供緩衝功能。
4、PrintWriter和PrintStream極其類似,功能和使用也非常相似。
5、OutputStreamWriter是OutputStream到Writer轉換的橋樑,它的子類FileWriter其實就是一個實現此功能的具體類(具體可以研究一下Source Code)。功能和使用和OutputStream極其類似,後面會有它們的對應圖。

**

字符流的輸入與輸出的對應

**

字符流的輸入與輸出的對應

字節流和字符流的對應
Java的IO中存在輸入、輸出的對應和字節流和字符流的對應,下面就看看字節流和字符流的對應吧!

輸入的對應
下圖是IO中字節輸入流與字符輸入流的對應圖:
IO中字節輸入流與字符輸入流的對應圖

輸出的對應
下圖是IO中字節輸出流與字符輸出流的對應圖:

IO中字節輸出流與字符輸出流的對應圖

發佈了23 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章