Java System.in,System.out和System.error

时间:2020-01-09 10:36:07  来源:igfitidea点击:

Java具有3个流,分别称为System.in,System.out和System.err,这些流通常用于向Java应用程序提供输入和输出。最常用的可能是" System.out",用于从控制台程序(命令行应用程序)将输出写入控制台。

Java VM启动时,Java运行时会初始化System.in,System.out和System.err,因此我们不必自己实例化任何流(尽管我们可以在运行时交换它们)。在本教程的后面,我将更详细地解释每个流。

系统输入System.in

System.in是一个InputStream,通常连接到控制台程序的键盘输入。换句话说,如果我们从命令行启动Java应用程序,并且在CLI控制台(或者终端)具有焦点的情况下在键盘上键入内容,则通常可以通过System.in从该Java应用程序内部读取键盘输入。但是,只能通过System.in读取指向该Java应用程序(启动该应用程序的控制台/终端)的键盘输入。无法通过System.in读取其他应用程序的键盘输入。

System.in的使用不那么频繁,因为数据通常是通过命令行参数,文件或者可能通过网络连接(如果应用程序是为此目的而设计)传递给命令行Java应用程序的。在具有GUI的应用程序中,通过GUI给出了对应用程序的输入。这是与System.in不同的输入机制。

系统输出System.out

System.out是一个PrintStream,我们可以其中写入字符。 System.out通常会将我们写入其中的数据输出到CLI控制台/终端。 System.out通常用于诸如命令行工具之类的仅控制台程序中,以向用户显示其执行结果。这通常也用于打印程序的调试语句(尽管可能不是从程序中获取调试信息的最佳方法)。

系统错误System.err

System.err是一个PrintStream。 " System.err"的工作方式与" System.out"类似,只是它通常仅用于输出错误文本。一些程序(例如Eclipse)会将输出显示为System.err的红色文本,以使其更明显是错误文本。

简单的System.out + System.err示例:

这是一个使用System.outSystem.err的简单示例:

try {
  InputStream input = new FileInputStream("c:\data\...");
  System.out.println("File opened...");

} catch (IOException e){
  System.err.println("File opening failed:");
  e.printStackTrace();
}

交换系统流

即使3个"系统"流是java.lang.System类的静态成员,并且在JVM启动时已预先实例化,我们也可以更改对每个流使用什么流。只需为System.in设置一个新的InputStream,或者为System.out或者System.err设置一个新的OutputStream,所有其他数据都将被读/写到新流中。

要设置新的"系统"流,请使用以下方法之一:System.setIn(),System.setOut()或者System.setErr()。这是一个简单的示例:

OutputStream output = new FileOutputStream("c:\data\system.out.txt");
PrintStream printOut = new PrintStream(output);

System.setOut(printOut);

现在,所有写入" System.out"的数据都应重定向到文件" c:\ data \ system.out.txt"中。但是请记住,我们应该确保在JVM关闭之前刷新System.out并关闭文件,以确保所有写入System.out的数据实际上都已刷新到文件中。