web-dev-qa-db-ja.com

System.errのポイントは何ですか?

UNIXでは、Javaファイルを作成して、標準エラーに「EXIT 1」を出力し、ステータス1で終了します。

これが私のアプローチです。

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

これは私がやるべきことですか?

もしそうなら、どのようにUnixシェルでそれを使用することになっていますか? bashでコンパイルして実行すると、「EXIT 1」が出力されるだけです(したがって、System.out.printlnと同じことをします。なぜ「err」を使用する必要があるのですか?)。ここでの「標準エラー」とは何ですか?

20
Gavin Z.

実行中のすべてのプログラムには、次の3つのストリームがあります。

  • 標準入力(stdin)。通常はキーボードから入力されます。 _System.in_ として公開
  • 標準出力(stdout)。通常はコンソールに送られます。 _System.out_ として公開
  • 標準エラー(stderr)。通常はコンソールにも出力されます。 _System.err_ として公開

あなたのプログラムは正しいです-stderrに出力します。しかし、通常の状況では、stderrストリームはstdoutストリームと同じようにコンソールに送られるため、視覚的に区別できません。

ただし、エラーメッセージにstdoutではなくstderrを使用する必要がある理由は、redirectionです。つまり、コンソールではなくファイルにstderrを送信します。一方、2つのストリームは独立しているため、stdoutは影響を受けません。

たとえば、bash、cmd、PowerShellなどでこれを実行できます。

_$ Java Program 2> errors.txt
_

現在、System.err.println()を含むすべての出力は_errors.txt_になりますが、System.out.println()は引き続き画面に表示されます。これはデバッグに役立ちます。

29
MultiplyByZer0

ほとんどすべてのプロセスに関連付けられた3つのデータストリームがあります。

  • 標準入力:これは、端末、コンソール、別のプロセスからのパイプ出力、または他の手段からのプログラムへの入力のストリームです。
  • 標準エラー:これは、すべてのデバッグメッセージとエラーメッセージの送信先です。これは、この種の情報をプログラムの通常の出力から簡単に個別にキャプチャできるようにするためです。 Webサーバーは、エラーメッセージをerror_logファイルはstderr経由で、通常のログファイルはeです。 g。 access_log
  • 標準出力:これは、プログラムを実行しているユーザーがこの出力が表示されるのを期待するすべての典型的な予想される出力です。

標準出力(stdout)と標準エラー(stderr)は、ほぼ常に、それぞれプロセスからの最初と2番目の出力ストリームです。これにより、/path/to/my/neat/program > logs/program.log 2> logs/program.errおよび出力とエラーが適切にソートされています。

1
DopeGhoti