我想知道 System.err 是如何工作的

I would like to know how the System.err works

我正在检查 Java IO。刚开始使用标准输入和输出流。请看下面给出的简单程序,

   public static void main(String args[]){
        Scanner scanner = new Scanner(System.in);
        System.out.println("Give us your input");
        String str = scanner.nextLine();

        System.out.println("Standard Output: " + str);
        System.err.println("Standard Error Output: " +str );
    }

输出变化 运行 这两次或三次。请在下面找到几个输出,

运行 第一次:

给我们您的意见 我的名字 标准错误输出:我的名字 标准输出:我的名字

进程已完成,退出代码为 0

运行 第二次使用相同的代码: 给我们您的意见 我的名字 标准输出:我的名字 标准错误输出:我的名字

进程已完成,退出代码为 0

我想知道为什么输出随System.err

变化

您的程序将首先写入 System.out,然后写入 System.err(并且 println 也会刷新这些流),但无法保证 order/interleaving这两个流将出现在您的控制台中。

由于您实际上是在同时给他们写信,所以您会得到两种组合。我想你甚至可能会得到半行交错。

无法保证 System.out, System.in, System.err 的顺序可以先出现任何内容,因此这些流的顺序不固定

System.out 和 System.err 写入不同的流,这些流通过不同的管道连接到您的命令 shell。命令 shell 然后将从这些管道中读取并将数据写入您的控制台应用程序。这最终将写入您的屏幕。

在很多地方,写入一个流的数据可以 "overtake" 写入另一个流的数据。

  • 它可能发生在 JVM 本身中,因为 Java 规范不保证先写入哪个流。 (事实上​​ ,如果只有一个线程进行写入,这是不太可能的。使用当前的 Java 实现,行为可能是确定性的......尽管未指定。)

  • 它可能发生在 OS 中,因为无法保证写入两个独立管道的数据的交付顺序。

  • 它可能发生在 shell 中,因为 shell 规范中没有任何内容规定从管道读取的任何优先级。

简而言之,有很多地方的行为是未指定的。

还值得注意的是,观察到的行为可能取决于您使用的 Java 版本、OS 和 OS 工具、您的硬件和负载在您的系统上。

最后,您可能无法保证观察到的交错(或不一致)是一致的。如果您需要一致性,请将您的输出专门写入一个流或另一个流。