18

大量のテキストを出力する Java プロセスがあります。ときどき、テキストを少しだけ見たいと思うことがあります。通常のプログラムでは、次のことができます。

$ myprog | head

myprog から 10 行の出力が表示され、すぐに終了します。しかし、Javaを使用すると、次のようになります。

$ java MyClass | head

出力の最初の 10 行を取得しますが、Java プロセスはすべての処理が完了するまで終了しません。java は stdout (System.out) がなくなり、head プロセスが死んでなくなったことを気にしないようです。

他のすべてのプログラムは、cat のように黙って終了します。

$ cat /etc/group | head
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:

または、python のように、壊れたパイプ エラー/例外で終了します。

$ python -c 'while True: print "hi"' | head
hi
hi
hi
hi
hi
hi
hi
hi
hi
hi
Traceback (most recent call last):
  File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe

出力を head のようなものにパイプするときに System.out.println() を呼び出すときに、Java で例外を発生させるにはどうすればよいですか? 次のようなことができるようになりたいです:

try {
    while(true) {
        System.out.println("hi");
    }
} catch(BrokenPipeException e) {
    // exit gracefully
}
4

2 に答える 2

11

私は使用していますcheckError()

PrintStream-API-Docuから:

他の出力ストリームとは異なり、PrintStreamはIOExceptionをスローしません。代わりに、例外的な状況では、checkErrorメソッドを介してテストできる内部フラグを設定するだけです。

したがって、次のようなものを試してください。

        while(!System.out.checkError()) {
            System.out.println("hi");
        }
于 2012-07-27T21:11:47.473 に答える
1

サシャの回答.checkError()の方法が気に入らず、代わりに例外を受け取りたい場合は、使用できます

OutputStream stream = new FileOutputStream(FileDescriptor.out);

特定の機能を失いPrintStreamます。私の場合、それらは関連性がなく、このアプローチは、一連のハッキー チェックを作成するよりも簡単でした。

System.outviaSystem.setOutをリダイレクトした場合FileDescriptor.out、リダイレクトされたものではなく元の出力記述子を指すため、これは動作しないことに注意してください。

于 2014-06-16T05:52:01.840 に答える