System.err的作用是什么?

24
在UNIX中,我需要编写一个Java文件,能够向标准错误输出打印"EXIT 1",并以状态码1退出。 这是我的方法...
System.err.println("EXIT 1");
System.exit(1);

这是我应该做的吗?

如果是,我应该如何在Unix shell中使用它?当我在bash中编译和运行它时,它只打印“EXIT 1”(所以它做的事情与System.out.println相同,那我为什么要使用“err”?)。这里的“标准错误”是什么?


每个进程都可以有两个输出流,stdout和stderr。这些可以被过滤,以便如果您不关心“输出”,但想要记录错误,您可以这样做 - 例如... - MadProgrammer
1
顺便问一下,为什么计算机科学专业需要学习UNIX?- 如果你不想学计算机科学,为什么要选择这个专业呢? - James Allman
1
为什么标记为bash?这是一个纯粹的Java问题。 - DopeGhoti
2个回答

34

每个运行的程序都有这三个流:

  • 标准输入(stdin),通常来自键盘。在Java中表示为System.in
  • 标准输出(stdout),通常输出到控制台。在Java中表示为System.out
  • 标准错误(stderr),也通常输出到控制台。在Java中表示为System.err

你的程序是正确的——它确实将错误消息打印到了stderr。但是,在正常情况下,stderr流会像stdout流一样输出到控制台,因此它们在视觉上无法区分。

然而,你应该使用stderr而不是stdout来输出错误消息的原因是重定向。这意味着你可以将stderr发送到文件而不是控制台,同时stdout则不受影响,因为这两个流是独立的。

例如,在bash、cmd、PowerShell等中,你可以这样做:

$ java Program 2> errors.txt

现在,所有使用System.err.println()输出的内容将会被定向到errors.txt文件中,而System.out.println()仍然会输出到屏幕上。这可以帮助调试。


3
更重要的是,java程序 > 正常输出.txt 将运行该程序,并将正常的输出发送到文件(以便稍后处理),但仍将错误发送到屏幕。 - Martin Bonner supports Monica
有没有可能将输出(stdout/stderr)重定向到文件中? - shaahiin
@SmS 是的。 > 重定向标准输出,2> 重定向标准错误输出。要同时重定向两者,请使用 ./program >stdout.txt 2>stderr.txt(两个文件)或 ./program > combined.txt 2>&1(一个文件)。这种语法适用于 bash 和 cmd。 - MultiplyByZer0

1

几乎每个进程都有三个相关的数据流:

  • 标准输入:这是程序的输入流,可以从终端、控制台、其他进程的管道输出或其他方式输入。
  • 标准错误:所有调试和错误消息都应该在此处处理。这样可以轻松地从程序的常规输出中单独捕获此类信息。Web服务器通过将错误消息通过 stderr 发送到 error_log 文件来实现这一点,而正常日志文件可能是 access_log 等。
  • 标准输出:这是用户运行程序时应该期望看到输出的输出流。

标准输出 (stdout) 和标准错误 (stderr) 几乎总是来自进程的第一个和第二个输出流。这使我可以执行类似于 /path/to/my/neat/program > logs/program.log 2> logs/program.err 的操作,并且可以将输出和错误信息很好地分类。


请注意,不是“几乎”,而是在Unix系统上,“总是”。FD 0,1,2保证是stdin,stdout,stderr(分别)。 - BRPocock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接