java
中的
io
系統總結
Java
流在處理上分為字符流和字節流。字符流處理的單元為
2
個字節的
Unicode
字符,分別操作字符、字符數組或字符串,而字節流處理單元為
1
個字節,操作字節和字節數組。
Java
內用
Unicode
編碼存儲字符,字符流處理類負責將外部的其他編碼的字符流和
java
內
Unicode
字符流之間的轉換。而類
InputStreamReader
和
OutputStreamWriter
處理字符流和字節流的轉換。字符流(一次可以處理一個緩沖區)一次操作比字節流(一次一個字節)效率高。
(
一
)
以字節為導向的
stream------InputStream/OutputStream
InputStream
和
OutputStream
是兩個
abstact
類,對于字節為導向的
stream
都擴展這兩個雞肋(基類
^_^
)
;
1,
??
InputStream
?
1.1
ByteArrayInputStream
--
把內存中的一個緩沖區作為
InputStream
使用
.
construct---
(A)ByteArrayInputStream(byte[])
創建一個新字節數組輸入流(
ByteArrayInputStream
),它從指定字節數組中讀取數據(
使用
byte
作為其緩沖區數組)
(B)---ByteArrayInputStream(byte[], int, int)
創建一個新字節數組輸入流,它從指定字節數組中讀取數據。
---mark::
該字節數組未被復制。
1.2
StringBufferInputStream
--
把一個
String
對象作為
InputStream .
construct---
StringBufferInputStream(String)
據指定串創建一個讀取數據的輸入流串。
注釋:不推薦使用
StringBufferInputStream
方法。
此類不能將字符正確的轉換為字節。
同
JDK 1.1
版中的類似,從一個串創建一個流的最佳方法是采用
StringReader
類。
1.3
FileInputStream
--
把一個文件作為
InputStream
,實現對文件的讀取操作
construct---
(A)FileInputStream(File name)
創建一個輸入文件流,從指定的
File
對象讀取數據。
(B)FileInputStream(FileDescriptor)
創建一個輸入文件流,從指定的文件描述器讀取數據。
(C)-FileInputStream(String? name)
創建一個輸入文件流,從指定名稱的文件讀取數據。
method ---- read()
從當前輸入流中讀取一字節數據。
read(byte[])
將當前輸入流中
b.length
個字節數據讀到一個字節數組中。
read(byte[], int, int)
將輸入流中
len
個字節數據讀入一個字節數組中。
1.4
PipedInputStream
:實現了
pipe
的概念,主要在線程中使用
.
管道輸入流是指一個通訊管道的接收端。
一個線程通過管道輸出流發送數據,而另一個線程通過管道輸入流讀取數據,這樣可實現兩個線程間的通訊。
construct---
PipedInputStream()
創建一個管道輸入流,它還未與一個管道輸出流連接。
PipedInputStream(PipedOutputStream)
創建一個管道輸入流
,
它已連接到一個管道輸出流。
1.5
SequenceInputStream
:把多個
InputStream
合并為一個
InputStream .
“序列輸入流”類允許應用程序把幾個輸入流連續地合并起來,
并且使它們像單個輸入流一樣出現。每個輸入流依次被讀取,直到到達該流的末尾。
然后“序列輸入流”類關閉這個流并自動地切換到下一個輸入流。
construct---
SequenceInputStream(Enumeration)
創建一個新的序列輸入流,并用指定的輸入流的枚舉值初始化它。
SequenceInputStream(InputStream, InputStream)
創建一個新的序列輸入流,初始化為首先
讀輸入流
s1,
然后讀輸入流
s2
。
(二)
OutputSteam
2.1
ByteArrayOutputStream
:
把信息存入內存中的一個緩沖區中
.
該類實現一個以字節數組形式寫入數據的輸出流。
當數據寫入緩沖區時,它自動擴大。用
toByteArray()
和
toString()
能檢索數據。
constructor
(A)--- ByteArrayOutputStream()
創建一個新的字節數組輸出流。
(B)--- ByteArrayOutputStream()
創建一個新的字節數組輸出流。
(C)--- ByteArrayOutputStream(int)
創建一個新的字節數組輸出流,并帶有指定大小字節的緩沖區容量。
toString(String)
根據指定字符編碼將緩沖區內容轉換為字符串,并將字節轉換為字符。
write(byte[], int, int)
將指定字節數組中從偏移量
off
開始的
len
個字節寫入該字節數組輸出流。
write(int)
將指定字節寫入該字節數組輸出流。
writeTo(OutputStream)
用
out.write(buf, 0, count)
調用輸出流的寫方法將該字節數組輸出流的全部內容寫入指定的輸出流參數。
2.2
FileOutputStream:
文件輸出流是向
File
或
FileDescriptor
輸出數據的一個輸出流。
constructor
(A)FileOutputStream(File? name)
創建一個文件輸出流,向指定的
File
對象輸出數據。
(B)FileOutputStream(FileDescriptor)
創建一個文件輸出流,向指定的文件描述器輸出數據。
(C)FileOutputStream(String? name)
創建一個文件輸出流,向指定名稱的文件輸出數據。
(D)FileOutputStream(String, boolean)
用指定系統的文件名,創建一個輸出文件。
2.3
PipedOutputStream:
管道輸出流是指一個通訊管道的發送端。
一個線程通過管道輸出流發送數據,
而另一個線程通過管道輸入流讀取數據,這樣可實現兩個線程間的通訊。
constructor
(A)PipedOutputStream()
創建一個管道輸出流,它還未與一個管道輸入流連接。
(B)PipedOutputStream(PipedInputStream)
創建一個管道輸出流,它已連接到一個管道輸入流。
(
二
)
以字符為導向的
stream Reader/Writer
以
Unicode
字符為導向的
stream
,表示以
Unicode
字符為單位從
stream
中讀取或往
stream
中寫入信息。
Reader/Writer
為
abstact
類
以
Unicode
字符為導向的
stream
包括下面幾種類型:
1.???????
Reader
?
1.1
?
CharArrayReader
:與
ByteArrayInputStream
對應此類實現一個可用作字符輸入流的字符緩沖區
constructor
CharArrayReader(char[])
用指定字符數組創建一個
CharArrayReader
。
CharArrayReader(char[], int, int)
用指定字符數組創建一個
CharArrayReader
1.2
StringReader
:
與
StringBufferInputStream
對應其源為一個字符串的字符流。
StringReader(String)
創建一新的串讀取者。
1.3
FileReader
:
與
FileInputStream
對應
1.4
PipedReader
:與
PipedInputStream
對應
2.?
Writer
?
2.1? ?
CharArrayWrite
:
與
ByteArrayOutputStream
對應
2.2??
StringWrite
:無與之對應的以字節為導向的
stream
2.3?
FileWrite
:
與
FileOutputStream
對應
2.4?
PipedWrite
:與
PipedOutputStream
對應
(三)
兩種不現導向的
stream
之間的轉換
3.1
InputStreamReader
和
OutputStreamReader
:
把一個以字節為導向的
stream
轉換成一個以字符為導向的
stream
。
InputStreamReader
類是從字節流到字符流的橋梁:它讀入字節,并根據指定的編碼方式,將之轉換為字符流。
使用的編碼方式可能由名稱指定,或平臺可接受的缺省編碼方式。
InputStreamReader
的
read()
方法之一的每次調用,可能促使從基本字節輸入流中讀取一個或多個字節。
為了達到更高效率,考慮用
BufferedReader
封裝
InputStreamReader
,
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
例如:
//
實現從鍵盤輸入一個整數
String s = null;???????????
InputStreamReader re = new InputStreamReader(System.in);
????????????? BufferedReader br = new BufferedReader(re);
?????
??
????????????? try {
????????????? s = br.readLine();
????????????? System.out.println("s= " + Integer.parseInt(s));
???
?????? br.close();
????????????? }
????????????? catch (IOException e)
????????????? {
????????????? e.printStackTrace();
????????????? }
????????????? catch (NumberFormatException e)//
當應用程序試圖將字符串轉換成一種數值類型,但該字符串不能轉換為適當格式時,拋出該異常。
????????????? {
????????????? System.out.println("
輸入的不是數字
");
????????????? }
InputStreamReader(InputStream)
用缺省的字符編碼方式,創建一個
InputStreamReader
。
InputStreamReader(InputStream, String)
用已命名的字符編碼方式,創建一個
InputStreamReader
。
OutputStreamWriter
將多個字符寫入到一個輸出流,根據指定的字符編碼將多個字符轉換為字節。
每個
OutputStreamWriter
合并它自己的
CharToByteConverter,
因而是從字符流到字節流的橋梁。
(四)
Java IO
的一般使用原則
:
一、按數據來源(去向)分類:
1
、是文件:
FileInputStream, FileOutputStream, (
字節流
)FileReader, FileWriter(
字符
)
2
、是
byte[]
:
ByteArrayInputStream, ByteArrayOutputStream(
字節流
)
3
、是
Char[]: CharArrayReader, CharArrayWriter(
字符流
)
4
是
String: StringBufferInputStream, StringBufferOuputStream (
字節流
)StringReader, StringWriter(
字符流
)
5
、網絡數據流:
InputStream, OutputStream,(
字節流
) Reader, Writer(
字符流
)
二、按是否格式化輸出分:
1
、要格式化輸出:
PrintStream, PrintWriter
三、按是否要緩沖分:
1
、要緩沖:
BufferedInputStream, BufferedOutputStream,(
字節流
) BufferedReader, BufferedWriter(
字符流
)
四、按數據格式分:
1
、二進制格式(只要不能確定是純文本的)
: InputStream, OutputStream
及其所有帶
Stream
結束的子類
2
、純文本格式(含純英文與漢字或其他編碼方式);
Reader, Writer
及其所有帶
Reader, Writer
的子類
五、按輸入輸出分:
1
、輸入:
Reader, InputStream
類型的子類
2
、輸出:
Writer, OutputStream
類型的子類
六、特殊需要:
1
、從
Stream
到
Reader,Writer
的轉換類:
InputStreamReader, OutputStreamWriter
2
、對象輸入輸出:
ObjectInputStream, ObjectOutputStream
3
、進程間通信:
PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4
、合并輸入:
SequenceInputStream
5
、更特殊的需要:
PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
決定使用哪個類以及它的構造進程的一般準則如下(不考慮特殊需要):
首先,考慮最原始的數據格式是什么:
原則四
第二,是輸入還是輸出:原則五
第三,是否需要轉換流:原則六第
1
點
第四,數據來源(去向)是什么:原則一
第五,是否要緩沖:原則三
(特別注明:一定要注意的是
readLine()
是否有定義,有什么比
read, write
更特殊的輸入或輸出方法)
第六,是否要格式化輸出:原則二