From Gossip@Openhome

Java Gossip: InputStream、 OutputStream

電腦中的資料都是以0與1的方式來儲存,如果您要在兩個裝置之間進行資料的存取,當然也是以0與1位元的方式來進行,實際上資料的流動是透過電路,而上面 的資料則是電流,而在程式上來說,將資料目的地與來源之間抽象化為一個串流(Stream),而當中流動的則是位元資料。
01010101 Stream -->
來源地 ===================== 目的地

在Java中有兩個類別用來作串流的抽象表示:InputStream與OutputStream

InputStream是所有表示位元輸入串流的類別之父類別,它是一個抽象類別,子類會重新定義它當中所定義的方法, InputStream用於從裝置來源地讀取資料的抽象表示,例如System中的標準輸入串流 in 物件就是一個 InputStream,在程式開始之後,這個串流物件就會開啟,以從標準輸入裝置中讀取資料,這個裝置通常是鍵盤或是其它使用者定義的裝置。

OutputStream是所有表示位元輸出串流的類別之父類別,它是一個抽象類別,子類會重新定義它當中所定義的方法, OutputStream是用於將資料寫入目的地的抽象表示,例如System中的標準輸出串流物件 out ,out 的類型是PrintStream, 這個類別是OutputStream的子類別(FilterOutputStream繼承OutputStream, PrintStream再繼承FilterOutputStream),在程式開始之後,這個串流物件就會開啟,您可以將資料透過它來寫入目的地裝置,這 個裝置通常是螢幕或其它使用者定義的裝置。

下面程式可以讀取鍵盤輸入串流,並將資料以10進位方式顯示在螢幕上:

  • StreamDemo.java
package onlyfun.caterpillar;

import java.io.*;

public class StreamDemo {
public static void main(String[] args) {
try {
System.out.print("輸入字元: ");
System.out.println("輸入字元十進位表示: " +
System.in.read());
System.out.println("換行字元十進位表示: " +
System.in.read());
}
catch(IOException e) {
e.printStackTrace();
}
}
}

執行結果: 
輸入字元: A 
輸入字元十進位表示: 65
換行字元十進位表示: 10


字元A輸入後被標準輸入串流讀取,A的位元表示以十進位來看就是65,這是A字元的編碼(查查ASCII編碼表就知道了),在這邊要注意的是read()只讀取一個位元組的資料,而當輸入A並按Enter鍵時,實際上在串流中會有A的位元資料與換行字元的位元資料,換行字元的位元資料以十進位來表示的話就是10。

作業系統之間的換行字元各不相同,Windows 為"\r\n",Linux 為'\n',而 Mac 為'\r'