system.in, system.out, system.err这3个流同样是常见的数据来源和数据流目的地。使用最多的可能是在控制台程序里利用system.out将输出打印到控制台上。
jvm启动的时候通过java运行时初始化这3个流,所以你不需要初始化它们(尽管你可以在运行时替换掉它们)。
system.in是一个典型的连接控制台程序和键盘输入的inputstream流。通常当数据通过命令行参数或者配置文件传递给命令行java程序的时候,system.in并不是很常用。图形界面程序通过界面传递参数给程序,这是一块单独的java io输入机制。
system.out是一个printstream流。system.out一般会把你写到其中的数据输出到控制台上。system.out通常仅用在类似命令行工具的控制台程序上。system.out也经常用于打印程序的调试信息(尽管它可能并不是获取程序调试信息的最佳方式)。
system.err是一个printstream流。system.err与system.out的运行方式类似,但它更多的是用于打印错误文本。一些类似eclipse的程序,为了让错误信息更加显眼,会将错误信息以红色文本的形式通过system.err输出到控制台上。
这是一个system.out和system.err结合使用的简单示例:
尽管system.in, system.out, system.err这3个流是java.lang.system类中的静态成员(译者注:这3个变量均为final static常量),并且已经预先在jvm启动的时候初始化完成,你依然可以更改它们。只需要把一个新的inputstream设置给system.in或者一个新的outputstream设置给system.out或者system.err,之后的数据都将会在新的流中进行读取、写入。
可以使用system.setin(), system.setout(), system.seterr()方法设置新的系统流(译者注:这三个方法均为静态方法,内部调用了本地native方法重新设置系统流)。例子如下:
现在所有的system.out都将重定向到”c:\\data\\system.out.txt”文件中。请记住,务必在jvm关闭之前冲刷system.out(译者注:调用flush()),确保system.out把数据输出到了文件中。