System.err的意义何在



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

这是我的方法。。

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

这就是我应该做的吗?

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

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

  • 标准输入(stdin),通常来自键盘。暴露为System.in
  • 标准输出(stdout),它通常进入控制台。暴露为System.out
  • 标准错误(stderr),通常也会进入控制台。暴露为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()仍将进入屏幕。这有助于调试。

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

  • 标准输入:这是程序的输入流,可以来自终端、控制台、另一个进程的管道输出,也可以来自其他方式
  • 标准错误:这是所有调试和错误消息的位置。这使得这类信息可以容易地从程序的常规输出中单独捕获。Web服务器通过stderrerror_log文件发送错误消息来实现这一点,而正常的日志文件将是例如access_log
  • 标准输出:这是运行程序的用户期望看到所述输出的所有典型、期望的输出出现的地方

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

相关内容

  • 没有找到相关文章

最新更新