6

文字データと生のバイトデータを書き込むソケットがあります。文字データの場合は、PrintWriter. 生のバイト データの場合は、 に直接書き込む方が簡単OutputStreamです。したがって、コード全体で、次のようなセグメントがあります。

Writer writer = new PrintWriter(outputStream);
writer.write(someText);
...
writer.flush();
// No call to writer.close(), because that would close the underlying stream.

Writer他の方法でストリームへの書き込みを開始した後、これに書き込まないように注意している限り、これは問題ありません。IOExceptionしかし、誤ってストリームに書き込みを行った場合 (ストリームを閉じた場合のように) を取得することを知っておくことの安全性を優先します。

Writer基になるストリームを閉じずに、への将来の書き込みを明示的に防止する方法はありますか?

4

5 に答える 5

10

なんで?(1) ライターをフラッシュし、(2)ネストされたライターをclose()呼び出すという 2 つのことだけを行います。close()(2) を望まない場合は、flush()自分自身に電話をかけclose()、まったく電話をかけないでください。

于 2013-03-04T08:38:49.810 に答える
7

簡単に言えば、いいえ。Java io ストリーム クラスの記述方法では、常にクローズ操作を連鎖させます。もちろん、この動作をオーバーライドする独自のライター実装を作成することもできます。

于 2013-03-04T01:37:59.403 に答える
0

次のような、文字とバイナリ データの両方を書き込むことができる特別なクラスを作成します。

class CombinedWriter extends Writer {
    private boolean isWritingBinary;
    private Writer mWriter;
    private OutputStream mOutputStream;
    public void write(byte[] bytes) {
        // flush the writer if necessary
        isWritingBinary = true;
        mOutputStream.write(bytes);
    }
    public void write(String string) {
        // flush if necessary
        isWritingBinary = false;
        mWriter.write(string);
    }
    public void flush() {
        // ...
    }
    public void close() {
        // ...
    }
}

伸びるかもしれないし、伸びないかもしれませんWriter。後者の場合、コードで使用されていないメソッドをオーバーライドする必要はありません。

ライター フラッシュのトリックはまだありますが、1 つのクラスにローカライズされています。さらに、将来のバージョンでトリックが壊れた場合は、クラスを書き直してトリックを排除する可能性があります (コードの一部を Android ソースから借用する必要がある可能性があります)。

于 2015-02-24T13:10:28.760 に答える