2

System.out のエンコーディングを変更しようとして、私は PrintWriter を作成しました

PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, ENCODING));
それで

out.format("何らかのテキスト");

エンコーディングに関してはうまくいきました。しかし

out.checkError()
Unix の「head」コマンドなどによって出力ストリームが閉じられたときに true を返さなかった問題を修正しました。

PrintStream がエンコーディング付きのコンストラクターを提供していることがわかりました

PrintStream out = new PrintStream(System.out, true, ENCODING);

このクラスでは checkError() が正常に機能しました。

PrintWriter のケースがバグではないかと疑っていますが、何か足りないのでしょうか?

4

1 に答える 1

0

いいえ、これはバグではないと思いますがcheckError()、根底にあるクラスの微妙に異なる定義/設計に根ざしています:

  • PrintWriter.checkError() :

    public boolean checkError()ストリームが閉じていない場合 はストリームをフラッシュし、エラー状態をチェックします。 戻り値:true基になる出力ストリームで、またはフォーマット変換中に、印刷ストリームでエラーが発生した場合。

  • およびPrintStream.checkError()から:

    public boolean checkError()ストリームをフラッシュし、エラー状態をチェックします。内部エラー状態は、基になる出力ストリームが以外trueをスローしたとき、およびメソッドが呼び出されたときに に設定されます。基礎となる出力ストリームに対する操作が をスローした場合、 は次のことを実行して例外を割り込みに戻します: または同等の処理を行います。戻り値: このストリームが以外に遭遇した場合、またはメソッドが呼び出された場合にのみ。IOExceptionInterruptedIOExceptionsetErrorInterruptedIOExceptionPrintStreamThread.currentThread().interrupt();trueIOExceptionInterruptedIOExceptionsetError

ご覧PrintStreamのとおり、 のcheckError()定義はより厳密であり、失敗はまだ調査する価値があるかもしれません。

そして、実際の出力コンソール (およびそれがサポートするエンコーディング) に大きく依存します。たとえば、Windows では、次のことを行う必要があります。

chcp 65001

..(例)UTF-8出力を有効にします(https://stackoverflow.com/a/388500/592355、https: //stackoverflow.com/a/10148976/592355 ... )

于 2015-04-27T22:24:57.917 に答える