Java1.0中所有與輸入有關的類都繼承自InputStream,此類包含用於讀取單個字節或字節數組的read()方法。所有與輸出有關的類都繼承自OutputStream,這個類包含用於寫入單個字節或字節數組的write()方法。
1. InputStream類型
字節數組:ByteArrayInputStream, 內存緩衝區作爲InputStream使用
String對象:StringBufferInputStream, 將一個String轉化成InputStream的一個String,採用一個StringBuffer作爲數據源
文件:FileInputStream,從文件中讀取信息,將File或者FileDescriptor作爲數據源
管道:PipedInputStream,爲相關的PipedOutputStream提供數據源
連接:SequenceInputStream,將多個InputStream對象轉化成單個InputStream使用
過濾器:FilterInputStream,過濾InputStream的數據源
2. OutputStream類型
衍生自這個類的類決定我們的輸入去往何處
字節數組:ByteArrayOutputStream,內存中的緩衝區
文件:FileOutputStream,輸出到文件
管道:PipedOutputStream,自動成爲相關PipedInputStream的輸出
過濾器:FilterOutputStream,過濾OutputStream的輸出
3. FilterInputStream
FilterInputStream用於完成兩類事情:讀取不同的基本類型數據及String對象(DataInputStream),修改InputStream內部行爲如是否進行緩衝
DataInputStream:與DataOutputStream聯合使用,讀取一個流中的基本數據類型
BufferedInputStream:預先讀入緩衝,加快讀取速度
LineNumberInputStream:跟蹤輸入流中的行號
PushbackInputStream:有一個字節的後推緩衝,可後推讀入的上一個字符
4. FilterOutputStream
DataOutputStream:與DataInputStream配合使用,將基本數據類型寫入OutputStream,使得任何機器上的DataInputStream都能正常讀取
PrintStream:用於產生格式化輸出
BufferedOutputStream:要求先寫入緩衝區
5. RandomAccessFile
RandomAccessFile用於包含了已知長度記錄的文件,我們可用seek()從一條記錄移動至另一條,讀取或修改記錄。RandomAccessFile不屬於InputStream OutputStream系統,而是直接繼承自Object。
6. IO流的典型應用
package com.test;
import java.io.*;
public class IOTest {
public static void main(String[] args) {
try {
//Buffered input file
DataInputStream in = new DataInputStream(
new FileInputStream(args[0]));
String s, s2 = new String();
while ((s = in.readLine()) != null) {
s2 += s + "/n";
}
in.close();
//Input from memory
StringBufferInputStream in2 = new StringBufferInputStream(s2);
int c;
while ((c = in2.read()) != -1) {
System.out.print((char)c);
}
//Formatted memory input
try {
DataInputStream in3 = new DataInputStream(
new StringBufferInputStream(s2));
while (true) {
System.out.print((char)in3.readByte());
}
} catch (EOFException e) {
System.out.println("End of stream");
}
//Line numbering & file output
try {
LineNumberInputStream li = new LineNumberInputStream(
new StringBufferInputStream(s2));
DataInputStream in4 = new DataInputStream(li);
PrintStream out1 = new PrintStream(
new BufferedOutputStream(
new FileOutputStream("IODemo.out")));
while ((s = in4.readLine()) != null) {
out1.println("Line " + li.getLineNumber() + s);
}
out1.close();
} catch (EOFException e) {
System.out.println("End of Stream");
}
//Storing and recovering data
try {
DataOutputStream out2 = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("Data.txt")));
out2.writeBytes("Here's the value of pi: \n");
out2.writeDouble(3.141592);
out2.close();
DataInputStream in5 = new DataInputStream(
new BufferedInputStream(
new FileInputStream("Data.txt")));
System.out.println(in5.readLine());
System.out.println(in5.readDouble());
} catch (EOFException e) {
System.out.println("End of stream");
}
//Reading/writing radom access file
RandomAccessFile rf = new RandomAccessFile("rtest.dat", "rw");
for (int i = 0; i < 10; i++) {
rf.writeDouble(i*1.414);
}
rf.close();
rf = new RandomAccessFile("rtest.dat", "rw");
rf.seek(5*8);
rf.writeDouble(47.0001);;
rf.close();
rf = new RandomAccessFile("rtest.dat", "r");
for (int i = 0; i < 10; i ++) {
System.out.println("Value " + i + ": " + rf.readDouble());
}
rf.close();
} catch (FileNotFoundException e) {
System.out.println("File not found:" + args[0]);
} catch (IOException e) {
System.out.println("IO Exception");
}
}
}
Java1.1 IO System
Java1.1保留了原來的InputStream和OutputStream系統,但是引入了新的Reader和Writer類實現了另一中IO設計方案。這兩種系統可通過橋類轉換,InputStreamReader將InputStream轉換成Reader,OutputStreamWriter將OutputStream轉換成Writer。新IO系統中添加了與之前對應的類,如下:
Java1.0 | Java1.1 |
InputStream | Reader converter:InputStreamReader |
OutputStream | Writer converter:OutputStreamWriter |
FileInputStream | FileReader |
FileOutputStream | FileWriter |
StringBufferInputStream | StringReader |
沒有對應類 | StringWriter |
ByteArrayInputStream | CharArrayReader |
ByteArrayOutputStream | CharArrayWriter |
PipedyInputStream | PipedReader |
PipedyOutputStream | PipedWriter |
過濾器:
Java1.0 | Java1.1 |
FilterInputStream | FilterReader |
FilterOutputStream | FilterWriter |
BufferedInputStream | BufferedReader 含有readline() |
BufferedOutputStream | BufferedWriter |
DataInputStream | DataInputStream 用到readline()時需要BufferedReader |
PrintStream | PrintWriter |
LineNumberInputStream | LineNumberReader |
StreamTokenizer | StreamTokenizer |
PushBackInputStream | PushBackReader |
爲改變的類:
DataOutputStream
File
RandomAccessFile
SequenceInputStream