Java 1.1在System類中添加了特殊的方法,允許我們重新定向標准輸入、輸出以及錯誤IO流。此時要用到下述簡單的靜態方法調用:
setIn(InputStream)
setOut(PrintStream)
setErr(PrintStream)
如果突然要在屏幕上生成大量輸出,而且滾動的速度快於人們的閱讀速度,輸出的重定向就顯得特別有用。在一個命令行程序中,如果想重復測試一個特定的用戶輸入序列,輸入的重定向也顯得特別有價值。下面這個簡單的例子展示了這些方法的使用:
//: Redirecting.java // Demonstrates the use of redirection for // standard IO in Java 1.1 import java.io.*; class Redirecting { public static void main(String[] args) { try { BufferedInputStream in = new BufferedInputStream( new FileInputStream( "Redirecting.java")); // Produces deprecation message: PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out"))); System.setIn(in); System.setOut(out); System.setErr(out); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String s; while((s = br.readLine()) != null) System.out.println(s); out.close(); // Remember this! } catch(IOException e) { e.printStackTrace(); } } } ///:~
這個程序的作用是將標准輸入同一個文件連接起來,並將標准輸出和錯誤重定向至另一個文件。
這是不可避免會遇到“反對”消息的另一個例子。用-deprecation標志編譯時得到的消息如下:
Note:The constructor java.io.PrintStream(java.io.OutputStream) has been deprecated.
注意:不推薦使用構建器java.io.PrintStream(java.io.OutputStream)。
然而,無論System.setOut()還是System.setErr()都要求用一個PrintStream作為參數使用,所以必須調用PrintStream構建器。所以大家可能會覺得奇怪,既然Java 1.1通過反對構建器而反對了整個PrintStream,為什麼庫的設計人員在添加這個反對的同時,依然為System添加了新方法,且指明要求用PrintStream,而不是用PrintWriter呢?畢竟,後者是一個嶄新和首選的替換措施呀?這真令人費解。