數據流一般分為輸入流(InputStream)和輸出流(OutputStream)兩種,但是在操作文件時,當向其中寫數據時,它就是一個輸出流;當從其中讀取數據時,它就是一個輸入流。當然,鍵盤只是一個輸入流,而屏幕則只是一個輸出流。
Java的標准數據流是指在字符方式下(如DOS),程序與系統進行交互的方式,分為三種:
System.in
“標准”輸入流。此流已打開並准備提供輸入數據。通常,此流對應於鍵盤輸入或者由主機環境或用戶指定的另一個輸入源。
System.out
“標准”輸出流。此流已打開並准備接受輸出數據。通常,此流對應於顯示器輸出或者由主機環境或用戶指定的另一個輸出目標。
System.err
“標准”錯誤輸出流。此流已打開並准備接受輸出數據。
通常,此流對應於顯示器輸出或者由主機環境或用戶指定的另一個輸出目標。按照慣例,此輸出流用於顯示錯誤消息,或者顯示那些即使用戶輸出流(變量 out 的值)已經重定向到通常不被連續監視的某一文件或其他目標,也應該立刻引起用戶注意的其他信息。
下面以一個例子來說明:用System.in.read(buffer)從鍵盤輸入一行字符,存儲在緩沖區buffer中,count保存實際讀入的字節個數,再以整數和字符兩種方式輸出buffer中的值。read方法在java.io包中,而且要拋出IOException異常,我們在這裡用try/catch捕捉。程序如下(本例程序放在包biz.1cn.stream裡面):
package biz.1cn.stream;
import java.io.IOException;
/**
* @author chenrz(simon)
* @date 2006-6-29
* <p>
* 標准數據流例子(www.1cn.biz)
* </p>
*/
public class Input {
public static void main(String[] args) {
System.out.println("請輸入:");
// 輸入緩沖區域
byte buffer[] = new byte[512];
int count;
try {
// 讀取標准輸入流
count = System.in.read(buffer);
System.out.println("實際讀入的字節數目:" + count);
System.out.println("輸出結果:");
// 直接輸出buffer元素值
for (int i = 0; i < count; i++) {
System.out.print(buffer[i] + " ");
}
System.out.println();
// 以char方式輸出buffer
for (int i = 0; i < count; i++) {
System.out.print((char) buffer[i]);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
下面說一下java.io包中的數據流及文件類
InputStream是表示字節輸入流的所有類的超類。需要定義InputStream的子類的應用程序必須始終提供返回下一個輸入字節的方法,也就是以字節作為基本處理單位。
直接已知子類:
AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream
OutputStream是表示輸出字節流的所有類的超類。輸出流接受輸出字節並將這些字節發送到某個接收器,需要定義 OutputStream 子類的應用程序必須始終提供至少一種可寫入一個輸出字節的方法。
直接已知子類:
ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
Reader用於讀取字符流的抽象類。子類必須實現的方法只有 read(char[], int, int) 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
直接已知子類:
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
Writer寫入字符流的抽象類。子類必須實現的方法僅有 write(char[], int, int)、flush() 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
直接已知子類:
BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter