System.err的意义何在?

2022-09-02 01:14:57

在 UNIX 中,我应该编写一个 Java 文件,该文件将“EXIT 1”打印为标准错误,然后退出状态为 1。

这是我的方法。

System.err.println("EXIT 1");
System.exit(1);

这是我应该做的吗?

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


答案 1

每个正在运行的程序都有以下三个流:

  • 标准输入 (stdin),通常来自键盘。暴露为 System.in
  • 标准输出(标准输出),通常转到控制台。公开为系统。
  • 标准错误 (stderr),通常也会转到控制台。公开为 System.err

您的程序是正确的 - 它确实打印到stderr。但在正常情况下,stderr 流就像 stdout 流一样进入控制台,因此它们在视觉上无法区分。

但是,对于错误消息,您应该使用 stderr 而不是 stdout 的原因是重定向。这意味着您将 stderr 发送到文件而不是控制台。同时,stdout 不会受到影响,因为这两个流是独立的。

例如,您可以在bash,cmd,PowerShell等中执行此操作:

$ java Program 2> errors.txt

现在,所有输出都将以 结束,而仍将转到屏幕。这可以帮助调试。System.err.println()errors.txtSystem.out.println()


答案 2

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

  • 标准输入:这是从终端,控制台,来自另一个进程的管道输出或其他方式的输入流到程序中。
  • 标准错误:这是所有调试和错误消息应转到的位置。这样,就可以轻松地从程序的常规输出中捕获此类信息。Web 服务器通过 向文件发送错误消息来执行此操作,而正常的日志文件将是 例如 。error_logstderraccess_log
  • 标准输出:这是运行程序的用户应该期望看到所述输出的所有典型预期输出出现的位置。

标准输出 () 和标准误差 () 几乎总是分别来自进程的第一个和第二个输出流。这使我能够做类似的事情,并对输出和错误进行很好的排序。stdoutstderr/path/to/my/neat/program > logs/program.log 2> logs/program.err


推荐