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