Java 有 3 个名为 System.in、System.out 和 System.err 的流,通常用于为 Java 应用程序提供输入和输出。最常用的可能是 System.out,用于将控制台程序(命令行应用程序)的输出写入控制台。
注意:System.in、System.out 和 System.err 是在 Java 虚拟机启动时由 Java 运行时初始化,因此你不必自己实例化任何流(尽管你可以在运行时设置它们)。
System.in 是一个 InputStream,通常与控制台程序的键盘输入相连。换句话说,如果你从命令行启动 Java 应用程序,并在 CLI 控制台(或终端)有焦点时在键盘上键入内容,键盘输入通常可通过 System.in 从 Java 应用程序内部读取。不过,只有针对该 Java 应用程序的键盘输入才能通过 System.in 读取。其他应用程序的键盘输入无法通过 System.in 读取。
System.in 并不常用,因为数据通常是通过命令行参数、文件或网络连接传递给命令行 Java 应用程序的。在带有图形用户界面的应用程序中,应用程序的输入是通过图形用户界面提供的。
System.out 是一个可以写入字符的 PrintStream。System.out 通常会将写入的数据输出到 CLI 控制台/终端。System.out 通常用于命令行工具等纯控制台程序,向用户显示其执行结果。System.out 也常用于打印程序中的调试信息。
System.err 是一个 PrintStream。除了通常只用于输出错误文本外,System.err 的工作原理与 System.out 类似。有些程序(如 Eclipse)会用红色文本显示 System.err 的输出,以便更明显地显示这是错误文本。
Eclips效果:
IDEA效果:
以下是一个使用 System.out 和 System.err 的简单示例:
package com.hxstrive.java_io.demo01; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; /** * System.in、System.out、System.err 示例 * @author hxstrive.com */ public class SystemDemo { public static void main(String[] args) { try(InputStream input = new FileInputStream("C:\\Users\\Administrator\\Desktop\\example.txt")) { System.out.println("File opened..." + input); // 输出调试信息 } catch (IOException e){ System.err.println("File opening failed:"); // 输出错误信息 e.printStackTrace(); } } } //File opened...java.io.FileInputStream@7ef20235
即使 3 个 System 数据流都是 java.lang.System 类的静态成员,并且在 JVM 启动时被预先实例化,你也可以更改每个数据流的使用。只需为 System.in 设置一个新的 InputStream,或为 System.out 或 System.err 设置一个新的 OutputStream,所有后续数据都将被读/写到新流中。
要设置新的 System 流,请使用 System.setIn()、System.setOut() 或 System.setErr() 方法之一。
下面是一个简单的示例:
package com.hxstrive.java_io.demo01; import java.io.*; /** * System.in、System.out、System.err 示例 * @author hxstrive.com */ public class SystemDemo2 { public static void main(String[] args) { try(OutputStream output = new FileOutputStream( "C:\\Users\\Administrator\\Desktop\\output.txt")) { // 输出信息 PrintStream out = new PrintStream(output); System.setOut(out); // 将 System.out 修改到 PrintStream,输出到 output.txt 文件 // 输出数据 System.out.println("File opened..." + output); } catch (IOException e){ System.err.println("File opening failed:"); e.printStackTrace(); } } }
运行结果:
现在,写入 System.out 的所有数据都将重定向到文件 “C:\\Users\\Administrator\\Desktop\\output.txt”中。但请记住,你应该确保在 JVM 关闭之前刷新 System.out 并关闭文件,以确保写入 System.out 的所有数据都被刷新到文件中。