System.in, System.out, System.err是常见的数据来源与数据流目的地,使用最多的应该是使用其中的System.out将输出打印到控制台上。
JVM在启动时会初始化这三个流,所以你不需要初始化它们,尽管你可以在运行时替换掉它们。
System.in
System.in是一个连接控制台程序和键盘输入的InputStream流,可以读取用户从键盘输入的数据。
有以下三种常用方法读取控制台的输入,分别是System.in.read()、BufferedReader包装System.in、Scanner。
方法一,直接使用System.in.read()。
// 缺点:只能读一个字节的内容
char ch = (char)System.in.read();
System.out.println(ch);
方法二,BufferedReader包装System.in。
// InputStreamReader可以将字节流转换为字符流
Reader reader = new InputStreamReader(System.in);
// BufferedReader带有缓存功能,可以一次读一行
BufferedReader bufferedReader = new BufferedReader(reader);
String str = bufferedReader.readLine();
System.out.println(str);
方法三,使用Scanner。
Scanner scanner = new Scanner(System.in);
String next = scanner.next();
System.out.println(next);
上述代码可以将控制台输入正确获取并输出,但是有一个缺点,next()只能获取到空格前的字符串,空格后的字符串自动忽略。若想要连空格也作为字符串的一部分获取,需要使用nextLine()
方法。
System.out与System.err
System.out是一个PrintStream流。System.out一般会把你写到其中的数据输出到控制台上。System.out通常仅用在类似命令行工具的控制台程序上。
System.err是一个PrintStream流。System.err与System.out的运行方式类似,但它更多的是用于打印错误文本。在IDEA中,为了让错误信息更加显眼,错误信息以红色文本的形式通过System.err输出到控制台上。
替换系统流
尽管System.in, System.out, System.err这3个流是java.lang.System类中的静态成员,并且已经预先在JVM启动的时候初始化完成,你依然可以更改它们。只需要把一个新的InputStream设置给System.in,或者一个新的PrintStream设置给System.out或者System.err,之后的数据都将会在新的流中进行读取、写入。
使用System.setIn()
, System.setOut()
, System.setErr()
方法设置新的系统流。
// 将系统输入流改为本地文件
InputStream inputStream = new FileInputStream("D:\\test\\systemIn.txt");
System.setIn(inputStream);
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
int data = inputStreamReader.read();
while (data != -1) {
char ch = (char) data;
System.out.print(ch);
data = inputStreamReader.read();
}
inputStream.close();
// 将系统输出流改为本地文件,输出流中的信息都会输出到systemOut.txt中
OutputStream outputStream = new FileOutputStream("D:\\test\\systemOut.txt");
PrintStream printStream = new PrintStream(outputStream);
System.setOut(printStream);
System.out.println("out11");
// 调用flush(),将缓存区的数据冲刷到磁盘文件中
outputStream.flush();
outputStream.close();
// 将系统错误流改为本地文件,错误流中的信息都会输出到systemErr.txt中
OutputStream outputStream01 = new FileOutputStream("D:\\test\\systemErr.txt");
PrintStream printStream01 = new PrintStream(outputStream01);
System.setErr(printStream01);
System.err.println("err11");
// 调用flush(),将缓存区的数据冲刷到磁盘文件中
outputStream01.flush();
outputStream01.close();