2013-03-04 28 views
5

私はいくつかの文字データと生のバイトデータを書き込むソケットを持っています。文字データの場合は、PrintWriterを使用する方が簡単です。生のバイトデータの場合は、OutputStreamに直接書き込む方が簡単です。だから私のコード全体、私はこのようなセグメントを持っている:下にあるストリームを閉じずにWriterを閉じる方法はありますか?

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への今後の書き込みを明示的に防止する方法はありますか。

答えて

7

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

9

なぜですか? close()は、(1)ライターをフラッシュし、(2)ネストされたライターに対してclose()を呼び出すだけです。 (2)が欲しくない場合はflush()に電話し、close()には一切電話をしないでください。

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ソースからコードの一部を借りる必要があるでしょう)。

0

これは、文字とバイナリデータの両方のためのOutputStreamの使用方法である:あなたがdifferentエンコーディングをしたい場合

byte strBin[] = someText.getBytes("UTF-8"); 
outputStream.write(strBin); 

は "UTF-8" を交換してください。

関連する問題