原帖:http://www.xl7788.com/zt/computerprogram/JavaIO.html
(Input Stream)和輸出資料流(Output Stream)兩類,但這種劃分並不是絕對的。比如一個檔案,當向其中寫資料時,它就是一個輸出資料流;當從其中讀取資料時,它就是一個輸入資料流.
位元組流:從InputStream和OutputStream派生出來的一系列類。這類流以位元組(byte)為基本處理單位。
字元流:從Reader和Writer派生出的一系列類,這類流以16位的Unicode碼錶示的字元為基本處理單位.
Reader類和Writer類
前面說過,在JDK1.1之前,java.io包中的流只有普通的位元組流(以byte為基本處理單位的流),這種流對於以16位的Unicode碼錶示的 字元流處理很不方便。從JDK1.1開始, java.io包中加入了專門用於字元流處理的類,它們是以Reader和Writer為基礎派生的一系列類 同類InputStream和OutputStream一樣,Reader和Writer也是抽象類別,只提供了一系列用於字元流處理的介面。它們的方法與類InputStream 和OutputStream類似,只不過其中的參數換成字元或字元數組。
一. Input和Output
1. stream代表的是任何有能力產出資料的資料來源,或是任何有能力接收資料的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括兩種類型:
1.1 以位元組為導向的stream
以位元組為導向的stream,表示以位元組為單位從stream中讀取或往stream中寫入資訊。以位元組為導向的stream包括下面幾種類型:
(1) input stream:
1) ByteArrayInputStream:把記憶體中的一個緩衝區作為InputStream使用
2) StringBufferInputStream:把一個String對象作為InputStream
3) FileInputStream:把一個檔案作為InputStream,實現對檔案的讀取操作
4) PipedInputStream:實現了pipe的概念,主要線上程中使用
5) SequenceInputStream:把多個InputStream合并為一個InputStream
(2) Out stream:
1) ByteArrayOutputStream:把資訊存入記憶體中的一個緩衝區中
2) FileOutputStream:把資訊存入檔案中
3) PipedOutputStream:實現了pipe的概念,主要線上程中使用
4) SequenceOutputStream:把多個OutStream合并為一個OutStream
1.2 以Unicode字元為導向的stream
以Unicode字元為導向的stream,表示以Unicode字元為單位從stream中讀取或往stream中寫入資訊。以Unicode字元為導向的stream包括下面幾種類型:
(1) Input Stream
1) CharArrayReader:與ByteArrayInputStream對應
2) StringReader:與StringBufferInputStream對應
3) FileReader:與FileInputStream對應
4) PipedReader:與PipedInputStream對應
(2) Out Stream
1) CharArrayWrite:與ByteArrayOutputStream對應
2) StringWrite:無與之對應的以位元組為導向的stream
3) FileWrite:與FileOutputStream對應
4) PipedWrite:與PipedOutputStream對應
以字元為導向的stream基本上對有與之相對應的以位元組為導向的stream。兩個對應類實現的功能相同,字是在操作時的導向不同。 如 CharArrayReader:和ByteArrayInputStream的作用都是把記憶體中的一個緩衝區作為InputStream使用,所不同的是前者每次 從記憶體中讀取一個位元組的資訊,而後者每次從記憶體中讀取一個字元。
1.3 兩種不現導向的stream之間的轉換
InputStreamReader和OutputStreamReader:把一個以位元組為導向的stream轉換成一個以字元為導向的stream。
2. stream添加屬性
2.1 “為stream添加屬性”的作用
運用上面介紹的Java中操作IO的API,我們就可完成我們想完成的任何操作了。但通過FilterInputStream和FilterOutStream的子類,我們可以為stream添加屬性。下面以一個例子來說明這種功能的作用。如果我們要往一個檔案中寫入資料,我們可以這樣操作:
FileOutStream fs = new FileOutStream(“test.txt”);
然後就可以通過產生的fs對象調用write()函數來往test.txt檔案中寫入資料了。但是,如果我們想實現“先把要寫入檔案的資料 先緩衝到記憶體中,再把緩衝中的資料寫入檔案中”的功能時,上面的API就沒有一個能滿足我們的需求了。但通過FilterInputStream 和 FilterOutStream的子類,為FileOutStream添加我們需要的功能。
2.2 FilterInputStream的各種類型
2.2.1 用於封裝以位元組為導向的InputStream
1) DataInputStream:從stream中讀取基本類型(int、char等)資料。
2) BufferedInputStream:使用緩衝區
3) LineNumberInputStream:會記錄input stream內的行數,然後可以調用getLineNumber()和setLineNumber(int)
4) PushbackInputStream:很少用到,一般用於編譯器開發
2.2.2 用於封裝以字元為導向的InputStream
1) 沒有與DataInputStream對應的類。除非在要使用readLine()時改用BufferedReader,否則使用 DataInputStream
2) BufferedReader:與BufferedInputStream對應
3) LineNumberReader:與LineNumberInputStream對應
4) PushBackReader:與PushbackInputStream對應
2.3 FilterOutStream的各種類型
2.2.3 用於封裝以位元組為導向的OutputStream
1) DataIOutStream:往stream中輸出基本類型(int、char等)資料。
2) BufferedOutStream:使用緩衝區
3) PrintStream:產生格式化輸出
2.2.4 用於封裝以字元為導向的OutputStream
1) BufferedWrite:與對應
2) PrintWrite:與對應
3. RandomAccessFile
1) 可通過RandomAccessFile對象完成對檔案的讀寫操作
2) 在產生一個對象時,可指明要開啟的檔案的性質:r,唯讀;w,唯寫;rw可讀寫
3) 可以直接跳到檔案中指定的位置
java中的io系統總結.
java中的io中的(input/output)stream無非就是包括基於字元的stream、基於位元組的stream和把位元組導向的stream 轉換字元為導向的stream的stream。
以位元組為導向的stream------InputStream/OutputStream
InputStream 和 OutputStream是兩個abstact類,對於位元組為導向的stream都擴充這兩個基類;
--InputStream
ByteArrayInputStream -- 把記憶體中的一個緩衝區作為InputStream使用.
construct---ByteArrayInputStream(byte[])建立一個新位元組數組輸入資料流,它從指定位元組數組中讀取資料。
---ByteArrayInputStream(byte[], int, int) 建立一個新位元組數組輸入資料流,它從指定位元組數組中讀取資料。
--mark::該位元組數組未被複製。
StringBufferInputStream -- 把一個String對象作為InputStream .
注釋:不推薦使用 StringBufferInputStream 方法。 此類不能將字元正確的轉換為位元組。同 JDK 1.1 版中的類似,從一個串建立一個流的最佳方法是採用 StringReader 類。
construct---StringBufferInputStream(String) 據指定串建立一個讀取資料的輸入資料流串。
FileInputStream -- 把一個檔案作為InputStream,實現對檔案的讀取操作
construct---FileInputStream(File) 建立一個輸入檔案流,從指定的 File 對象讀取資料。
---FileInputStream(FileDescriptor) 建立一個輸入檔案流,從指定的檔案描述器讀取資料。
---FileInputStream(String) 建立一個輸入檔案流,從指定名稱的檔案讀取資料。
method ---- read() 從當前輸入資料流中讀取一位元組資料。
read(byte[]) 將當前輸入資料流中 b.length 個位元組資料讀到一個位元組數組中。
read(byte[], int, int) 將輸入資料流中 len 個位元組資料讀入一個位元組數組中。
PipedInputStream:實現了pipe的概念,主要線上程中使用. 管道輸入資料流是指一個通訊管道的接收端。
一個線程通過管道輸出資料流發送資料,另一個線程通過管道輸入資料流讀取資料,這樣實現兩個線程間的通訊。
PipedInputStream() 建立一個管道輸入資料流,它還未與一個管道輸出資料流串連。
PipedInputStream(PipedOutputStream) 建立一個管道輸入資料流, 它已串連到一個管道輸出資料流。
SequenceInputStream:把多個InputStream合并為一個InputStream .“序列輸入資料流”類允許應用程式把幾個輸入資料流連續地合并起來,並且使它們像單個輸入資料流一樣出現。每個輸入資料流依次被讀取,直到到達該流的末尾。然後“序列輸入資料流”類關閉這個流並自動地切換到下一個輸入資料流。
SequenceInputStream(Enumeration) 建立一個新的序列輸入資料流,並用指定的輸入資料流的枚舉值初始化它。
SequenceInputStream(InputStream, InputStream) 建立一個新的序列輸入資料流,初始化為首先 讀輸入資料流 s1, 然後讀輸入資料流 s2。
--OutputSteam
ByteArrayOutputStream:把資訊存入記憶體中的一個緩衝區中.該類實現一個以位元組數組形式寫入資料的輸出資料流。
當資料寫入緩衝區時,它自動擴大。用 toByteArray() 和 toString() 能檢索資料。
construct --- ByteArrayOutputStream() 建立一個新的位元組數組輸出資料流。
--- ByteArrayOutputStream() 建立一個新的位元組數組輸出資料流。
--- ByteArrayOutputStream(int) 建立一個新的位元組數組輸出資料流,並帶有指定大小位元組的緩衝區容量。
toString(String) 根據指定字元編碼將緩衝區內容轉換為字串,並將位元組轉換為字元。
write(byte[], int, int) 將指定位元組數組中從位移量 off 開始的 len 個位元組寫入該位元組數組輸出資料流。
write(int) 將指定位元組寫入該位元組數組輸出資料流。
writeTo(OutputStream) 用 out.write(buf, 0, count) 調用輸出資料流的寫方法將該位元組數組輸出資料流的全部內容寫入指定的輸出資料流參數。
FileOutputStream:檔案輸出資料流是向 File 或 FileDescriptor 輸出資料的一個輸出資料流。
FileOutputStream(File) 建立一個檔案輸出資料流,向指定的 File 對象輸出資料。
FileOutputStream(FileDescriptor) 建立一個檔案輸出資料流,向指定的檔案描述器輸出資料。
FileOutputStream(String) 建立一個檔案輸出資料流,向指定名稱的檔案輸出資料。
FileOutputStream(String, boolean) 用指定系統的檔案名稱,建立一個輸出檔案。
PipedOutputStream:管道輸出資料流是指一個通訊管道的發送端。 一個線程通過管道輸出資料流發送資料,而另一個線程通過管道輸入資料流讀取資料,這樣可實現兩個線程間的通訊。
PipedOutputStream() 建立一個管道輸出資料流,它還未與一個管道輸入資料流串連。
PipedOutputStream(PipedInputStream) 建立一個管道輸出資料流,它已串連到一個管道輸入資料流。
以字元為導向的stream Reader/Writer
以Unicode字元為導向的stream,表示以Unicode字元為單位從stream中讀取或往stream 中寫入資訊。
Reader/Writer 為abstact類
以Unicode字元為導向的stream包括下面幾種類型:
-- Reader
1) CharArrayReader:與ByteArrayInputStream對應
CharArrayReader(char[]) 用指定字元數組建立一個 CharArrayReader。
CharArrayReader(char[], int, int) 用指定字元數組建立一個 CharArrayReader。
2) StringReader:與StringBufferInputStream對應
StringReader(String) 建立一新的串讀取者。
3) FileReader:與FileInputStream對應
4) PipedReader:與PipedInputStream對應
-- Writer
1) CharArrayWrite:與ByteArrayOutputStream對應
2) StringWrite:無與之對應的以位元組為導向的stream
3) FileWrite:與FileOutputStream對應
4) PipedWrite:與PipedOutputStream對應
兩種不現導向的stream之間的轉換
InputStreamReader和OutputStreamReader:把一個以位元組為導向的stream轉換成一個以字元為導向的stream。一個 InputStreamReader 類是從位元組流到字元流的橋樑:它讀入位元組,並根據指定的編碼方式,將之轉換為字元流。使用的編碼方式可能由名稱指定,或平台可接受的預設編碼方式。
InputStreamReader 的 read() 方法之一的每次調用,可能促使從基本位元組輸入資料流中讀取一個或多個位元組。為了達到更高效率,考慮用 BufferedReader 封裝 InputStreamReader, BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader(InputStream) 用預設的字元編碼方式,建立一個 InputStreamReader。
InputStreamReader(InputStream, String) 用已命名的字元編碼方式,建立一個 InputStreamReader。
OutputStreamWriter 將多個字元寫入到一個輸出資料流,根據指定的字元編碼將多個字元轉換為位元組。每個 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是從字元流到位元組流的橋樑。