我想知道 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 工具、您的硬件和负载在您的系统上。
最后,您可能无法保证观察到的交错(或不一致)是一致的。如果您需要一致性,请将您的输出专门写入一个流或另一个流。
我正在检查 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 工具、您的硬件和负载在您的系统上。
最后,您可能无法保证观察到的交错(或不一致)是一致的。如果您需要一致性,请将您的输出专门写入一个流或另一个流。