我正在浏览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
而变化答案 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
可以先出现任何内容,以便不修复这些流的顺序