按照标准I/O模型,Java 提供了 System.in、System.out 和 System.err。
其中 System.out 已经事先被包装成了 PrintStream 对象。 System.err 同样
也是 PrintStream,但 System.in 却是一个没有被包装过的未经加工的 InputStream。
这意味着尽管我们可以立即使用 System.out 和 System.err,但是在读取 System.in
之前必须对其进行包装。
(1)从标准输入读取
BufferedReader in = new BufferedReader(
new InputStreamReader(System.in) );
String s;
while( ( ( s = in.readLine() ) != null ) && ( s.length() != 0 ) ) {
System.out.println(s);
}
(2)将 System.out 转换成 PrintWriter
System.out 是一个 PrintStream, 而 PrintStream 是一个 OutputStream。 PrintWriter
有一个可以接受 OutputStream 作为参数的构造器。因此,只要需要,就可以使用那个构造器把
System.out 转换成 PrintWriter:
PrintWriter out = new PrintWriter( System.out, true );
out.println("Hello, world");
重要的是使用有两个参数的 PrintWriter 的构造器,并将第二个参数设为 true, 以便开启自动清空
功能;否则,你可能看不到输出。
(3)标准I/O重定向
Java 的 System 类提供了一些简单的静态方法调用,以允许我们对标准输入、输出和错误I/O流进行重定向:
setIn(InputStream)
setOut(OutputStream)
setErr(OutputStream)
PrintStream console = System.out;
BufferedInputStream in = new BufferedInputStream(
new FileInputStream("Redirecting.java") );
PrintStream out = new PrintStream(
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!
System.setOut(console);
I/O重定向操纵的是字节流,而不是字符流;因此我们使用的是 InputStream 和
OutputStream,而不是 Reader 和 Writer。