以Unix首先倡導的“標准輸入”、“標准輸出”以及“標准錯誤輸出”概念為基礎,Java提供了相應的System.in,System.out以及System.err。貫這一整本書,大家都會接觸到如何用System.out進行標准輸出,它已預封裝成一個PrintStream對象。System.err同樣是一個PrintStream,但System.in是一個原始的InputStream,未進行任何封裝處理。這意味著盡管能直接使用System.out和System.err,但必須事先封裝System.in,否則不能從中讀取數據。
典型情況下,我們希望用readLine()每次讀取一行輸入信息,所以需要將System.in封裝到一個DataInputStream中。這是Java 1.0進行行輸入時采取的“老”辦法。在本章稍後,大家還會看到Java 1.1的解決方案。下面是個簡單的例子,作用是回應我們鍵入的每一行內容:
//: Echo.java // How to read from standard input import java.io.*; public class Echo { public static void main(String[] args) { DataInputStream in = new DataInputStream( new BufferedInputStream(System.in)); String s; try { while((s = in.readLine()).length() != 0) System.out.println(s); // An empty line terminates the program } catch(IOException e) { e.printStackTrace(); } } } ///:~
之所以要使用try塊,是由於readLine()可能“擲”出一個IOException。注意同其他大多數流一樣,也應對System.in進行緩沖。
由於在每個程序中都要將System.in封裝到一個DataInputStream內,所以顯得有點不方便。但采用這種設計方案,可以獲得最大的靈活性。