2010-07-02 12 views

回答

48

在Java System.out.println()将打印到您正在使用的系统之外的标准。另一方面,System.err.println()将打印到标准错误。

如果您使用的是简单的Java控制台应用程序,两个输出将是相同的(在命令行或控制台),但你可以重新配置流,因此例如,System.out仍然打印到控制台,但System.err写到一个文件。

另外,Eclipse等IDE显示为System.err红色文本,System.out默认为黑色文本。

+21

此外,System.out的缓冲,和System.err不 – 2010-07-02 05:27:59

+1

忘了这一点,THX清理起来noelmarkham – 2010-07-02 05:39:34

+3

不排除你的答案,但它通常被称为标准输出和标准错误(stdout/stderr),而不是标准输出和错误输出。 +1提前道歉,除了那个挑剔之外,你是对的。 – paxdiablo 2010-07-02 05:40:18

3

这些命令使用不同的输出流。默认情况下,这两条消息都将打印在控制台上,但可以将其中一个或两个都重定向到一个文件。

java MyApp 2>errors.txt 

这将重定向到System.err文件errors.txt

+3

'java myapp 2> errors.txt'什么是'2>'以及如何有用?你可以解释吗? – UnKnown 2016-04-01 02:29:06

17

System.out的是 “标准输出”(标准输出)和System.err是 “错误输出”(错误)。与System.in(stdin)一起,这些是Unix模型中的三个标准I/O流。大多数现代编程环境(C,Perl等)都支持这种模式。

标准输出流用于打印来自程序“正常操作”的输出,而错误流用于“错误消息”。这些需要分开 - 尽管在大多数情况下它们都出现在同一个控制台上。

假设您有一个简单的程序,您可以在其中输入电话号码并打印出具有该号码的人。如果你输入了一个无效号码,程序会通知你该错误,但它不应该这样做作为答案:如果你输入“999-ABC-4567”并且程序打印一条错误信息“Not a valid号码“,这并不意味着有一个名为”不是有效号码“的人的号码是999-ABC-4567。因此它不会向标准输出打印任何内容,并且错误输出中会显示消息“不是有效的数字”。

+0

我认为这是最好的答案,因为它解释了流的含义。 – 2015-02-05 15:02:21

-1

值得注意的是,OS有一个System.err和System.out的队列。请看下面的代码:

public class PrintQueue { 
    public static void main(String[] args) { 
     for(int i = 0; i < 100; i++) { 
      System.out.println("out"); 
      System.err.println("err"); 
     } 
    } 
} 

如果你编译并运行程序,你会看到的输出在控制台的命令混合起来。

如果您只使用System.out或System.err,则操作系统将保持正确的顺序。但是,如果您同时使用这两个选项,它可以随意选择要在控制台旁边打印的内容。

即使在这段代码,你可以看到,为了有时混合起来:

public class PrintQueue { 
    public static void main(String[] args) { 
     System.out.println("out"); 
     System.err.println("err"); 
    } 
} 
+0

“一个操作系统对于System.err和System.out都有一个队列。”这是一个非常笼统的,不一定准确的陈述。你在什么基础上做出这种表述? [引文需要] 在控制台应用程序(如'cmd'或'terminal')中,两个流(此答案称为“队列”)似乎都合并(因为它们显示在相同的终端仿真器中),但它们实际上是分开的。有关详细信息,请参见[stdout','stderr'和'stdin'](https://stackoverflow.com/a/3385261/2225787)之间的区别。 – 2017-11-03 13:51:16