Java IO:Java 的 System.in、System.out 和 System.error

Java 有 3 个名为 System.inSystem.outSystem.err 的流,通常用于为 Java 应用程序提供输入和输出。最常用的可能是 System.out,用于将控制台程序(命令行应用程序)的输出写入控制台。

注意:System.in、System.out 和 System.err 是在 Java 虚拟机启动时由 Java 运行时初始化,因此你不必自己实例化任何流(尽管你可以在运行时设置它们)。

System.in 输入

System.in 是一个 InputStream,通常与控制台程序的键盘输入相连。换句话说,如果你从命令行启动 Java 应用程序,并在 CLI 控制台(或终端)有焦点时在键盘上键入内容,键盘输入通常可通过 System.in 从 Java 应用程序内部读取。不过,只有针对该 Java 应用程序的键盘输入才能通过 System.in 读取。其他应用程序的键盘输入无法通过 System.in 读取。

System.in 并不常用,因为数据通常是通过命令行参数、文件或网络连接传递给命令行 Java 应用程序的。在带有图形用户界面的应用程序中,应用程序的输入是通过图形用户界面提供的。

System.out 输出

System.out 是一个可以写入字符的 PrintStream。System.out 通常会将写入的数据输出到 CLI 控制台/终端。System.out 通常用于命令行工具等纯控制台程序,向用户显示其执行结果。System.out 也常用于打印程序中的调试信息。

System.err 错误输出

System.err 是一个 PrintStream。除了通常只用于输出错误文本外,System.err 的工作原理与 System.out 类似。有些程序(如 Eclipse)会用红色文本显示 System.err 的输出,以便更明显地显示这是错误文本。

Eclips效果:

image.png

IDEA效果:

image.png

简单的 System.out 和 System.err 示例

以下是一个使用 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,所有后续数据都将被读/写到新流中。

image.png

要设置新的 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();
        }
    }

}

运行结果:

37431ab11e7dd0a5c6cbd2ab094629fc_1737014331439-72b15982-4e08-4fff-a9da-ba6cf8547738_x-oss-process=image%2Fformat%2Cwebp.png

现在,写入 System.out 的所有数据都将重定向到文件 “C:\\Users\\Administrator\\Desktop\\output.txt”中。但请记住,你应该确保在 JVM 关闭之前刷新 System.out 并关闭文件,以确保写入 System.out 的所有数据都被刷新到文件中。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号