徹底明白Java的IO系統 caiyi
(收藏)
關鍵字 Java
IO系統
一. Input和Output stream代表的是任何有能力產出數據的數據源或是任何有能力接收數據的接收源在Java的IO中所有的stream(包括Input和Out stream)都包括兩種類型 以字節為導向的stream
以字節為導向的stream
表示以字節為單位從stream中讀取或往stream中寫入信息
以字節為導向的stream包括下面幾種類型
) input stream
) ByteArrayInputStream
把內存中的一個緩沖區作為InputStream使用
) StringBufferInputStream
把一個String對象作為InputStream
) FileInputStream
把一個文件作為InputStream
實現對文件的讀取操作
) PipedInputStream
實現了pipe的概念
主要在線程中使用
) SequenceInputStream
把多個InputStream合並為一個InputStream
) Out stream
) ByteArrayOutputStream
把信息存入內存中的一個緩沖區中
) FileOutputStream
把信息存入文件中
) PipedOutputStream
實現了pipe的概念
主要在線程中使用
) SequenceOutputStream
把多個OutStream合並為一個OutStream
以Unicode字符為導向的stream
以Unicode字符為導向的stream
表示以Unicode字符為單位從stream中讀取或往stream中寫入信息
以Unicode字符為導向的stream包括下面幾種類型
) Input Stream
) CharArrayReader
與ByteArrayInputStream對應
) StringReader
與StringBufferInputStream對應
) FileReader
與FileInputStream對應
) PipedReader
與PipedInputStream對應
) Out Stream
) CharArrayWrite
與ByteArrayOutputStream對應
) StringWrite
無與之對應的以字節為導向的stream
) FileWrite
與FileOutputStream對應
) PipedWrite
與PipedOutputStream對應
以字符為導向的stream基本上對有與之相對應的以字節為導向的stream
兩個對應類實現的功能相同
字是在操作時的導向不同
如CharArrayReader
和ByteArrayInputStream的作用都是把內存中的一個緩沖區作為InputStream使用
所不同的是前者每次從內存中讀取一個字節的信息
而後者每次從內存中讀取一個字符
兩種不現導向的stream之間的轉換
InputStreamReader和OutputStreamReader
把一個以字節為導向的stream轉換成一個以字符為導向的stream
stream添加屬性 為stream添加屬性
的作用
運用上面介紹的Java中操作IO的API
我們就可完成我們想完成的任何操作了
但通過FilterInputStream和FilterOutStream的子類
我們可以為stream添加屬性
下面以一個例子來說明這種功能的作用
如果我們要往一個文件中寫入數據
我們可以這樣操作
FileOutStream fs = new FileOutStream(
test
txt
);
然後就可以通過產生的fs對象調用write()函數來往test
txt文件中寫入數據了
但是
如果我們想實現
先把要寫入文件的數據先緩存到內存中
再把緩存中的數據寫入文件中
的功能時
上面的API就沒有一個能滿足我們的需求了
但是通過FilterInputStream和FilterOutStream的子類
為FileOutStream添加我們所需要的功能
FilterInputStream的各種類型
用於封裝以字節為導向的InputStream
) DataInputStream
從stream中讀取基本類型(int
char等)數據
) BufferedInputStream
使用緩沖區
) LineNumberInputStream
會記錄input stream內的行數
然後可以調用getLineNumber()和setLineNumber(int)
) PushbackInputStream
很少用到
一般用於編譯器開發
用於封裝以字符為導向的InputStream
) 沒有與DataInputStream對應的類
除非在要使用readLine()時改用BufferedReader
否則使用DataInputStream
) BufferedReader
與BufferedInputStream對應
) LineNumberReader
與LineNumberInputStream對應
) PushBackReader
與PushbackInputStream對應
FilterOutStream的各種類型
用於封裝以字節為導向的OutputStream
) DataIOutStream
往stream中輸出基本類型(int
char等)數據
) BufferedOutStream
使用緩沖區
) PrintStream
產生格式化輸出
用於封裝以字符為導向的OutputStream
) BufferedWrite
與對應
) PrintWrite
與對應
RandomAccessFile ) 可通過RandomAccessFile對象完成對文件的讀寫操作
) 在產生一個對象時
可指明要打開的文件的性質
r
只讀
w
只寫
rw可讀寫
) 可以直接跳到文件中指定的位置
I/O應用的一個例子 import java
io
*;
public class TestIO{
public static void main(String[] args)
throws IOException{
//
以行為單位從一個文件讀取數據
BufferedReader in =
new BufferedReader(
new FileReader(
F:\\nepalon\\TestIO
java
));
String s
s
= new String();
while((s = in
readLine()) != null)
s
+= s +
\n
;
in
close();
//
b
接收鍵盤的輸入
BufferedReader stdin =
new BufferedReader(
new InputStreamReader(System
in));
System
out
println(
Enter a line:
);
System
out
println(stdin
readLine());
//
從一個String對象中讀取數據
StringReader in
= new StringReader(s
);
int c;
while((c = in
read()) !=
)
System
out
println((char)c);
in
close();
//
從內存取出格式化輸入
try{
DataInputStream in
=
new DataInputStream(
new ByteArrayInputStream(s
getBytes()));
while(true)
System
out
println((char)in
readByte());
}
catch(EOFException e){
System
out
println(
End of stream
);
}
//
輸出到文件
try{
BufferedReader in
=
new BufferedReader(
new StringReader(s
));
PrintWriter out
=
new PrintWriter(
new BufferedWriter(
new FileWriter(
F:\\nepalon\\ TestIO
out
)));
int lineCount =
;
while((s = in
readLine()) != null)
out
println(lineCount++ +
+ s);
out
close();
in
close();
}
catch(EOFException ex){
System
out
println(
End of stream
);
}
//
數據的存儲和恢復
try{
DataOutputStream out
=
new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(
F:\\nepalon\\ Data
txt
)));
out
writeDouble(
);
out
writeChars(
\nThas was pi:writeChars\n
);
out
writeBytes(
Thas was pi:writeByte\n
);
out
close();
DataInputStream in
=
new DataInputStream(
new BufferedInputStream(
new FileInputStream(
F:\\nepalon\\ Data
txt
)));
BufferedReader in
br =
new BufferedReader(
new InputStreamReader(in
));
System
out
println(in
readDouble());
System
out
println(in
br
readLine());
System
out
println(in
br
readLine());
}
catch(EOFException e){
System
out
println(
End of stream
);
}
//
通過RandomAccessFile操作文件
RandomAccessFile rf =
new RandomAccessFile(
F:\\nepalon\\ rtest
dat
rw
);
for(int i=
; i <
; i++)
rf
writeDouble(i*
);
rf
close();
rf = new RandomAccessFile(
F:\\nepalon\\ rtest
dat
r
);
for(int i=
; i <
; i++)
System
out
println(
Value
+ i +
+ rf
readDouble());
rf
close();
rf = new RandomAccessFile(
F:\\nepalon\\ rtest
dat
rw
);
rf
seek(
*
);
rf
writeDouble(
);
rf
close();
rf = new RandomAccessFile(
F:\\nepalon\\ rtest
dat
r
);
for(int i=
; i <
; i++)
System
out
println(
Value
+ i +
+ rf
readDouble());
rf
close();
}
}
關於代碼的解釋(以區為單位)
區中
當讀取文件時
先把文件內容讀到緩存中
當調用in
readLine()時
再從緩存中以字符的方式讀取數據(以下簡稱
緩存字節讀取方式
)
b區中
由於想以緩存字節讀取方式從標准IO(鍵盤)中讀取數據
所以要先把標准IO(System
in)轉換成字符導向的stream
再進行BufferedReader封裝
區中
要以字符的形式從一個String對象中讀取數據
所以要產生一個StringReader類型的stream
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25748.html