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

时间:2016-11-16 07:31:29

标签: java file-io inputstream outputstream

我正在浏览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

而变化

3 个答案:

答案 0 :(得分:3)

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

由于您几乎在同一时间写信给他们,因此您将获得两种组合。我想你甚至可能得到半行交错。

答案 1 :(得分:1)

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

有很多地方写入一个流的数据可以超过"写入另一个的数据。

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

  • 可能会在操作系统中发生,因为无法保证写入两个独立管道的数据传输顺序。

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

简而言之,有很多领域没有指明行为。

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

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

答案 2 :(得分:0)

不保证订单System.out, System.in, System.err可以先出现任何内容,以便不修复这些流的顺序