他の回答には重要な点/質問が欠けていると思います。
本当に OutputStream を使用する必要がありますか?
OutputStream
およびInputStream
クラス階層は、バイト指向データの書き込みと読み取り用です。しかし、Java Strings はバイト指向ではありません。それらは文字指向であり (最初の概算)、Java の文字は 16 ビットの Unicode コード単位です。
文字をバイト ストリームに書き込む場合、JVM は文字をバイトとしてエンコードする変換を行う必要があります。実際、これを行うには多くの方法があります。たとえば、UTF-8 はシーケンス内の各文字を 1バイト以上としてエンコードし、Latin-1 または ASCII は文字のサブセットを 1 バイトとしてエンコードし、他の文字を (おそらく) 疑問符に変換します。等々。
これで、次のように書くことができます。
public void print(String s){
o.write(s.getBytes());
}
しかし、それには問題があります。問題は、 のgetBytes()
メソッドString
が JVM のデフォルトの文字エンコード方式を使用して変換を行うことです。そして、これ (デフォルトのエンコード方式) は、JVM が起動された環境に依存します。そのため、そのコードは環境に応じてさまざまなことを行います。これで、文字セットを指定して修正できます。
public void print(String s){
o.write(s.getBytes("UTF-8"));
}
しかし、多くの場所で getBytes を呼び出している場合は面倒です。
テキストベースの出力が多い場合は、Writer
API の代わりに APIを使用することをお勧めしOutputStream
ます。API とそのWriter
実装は、内部で変換を処理し、より一貫して効率的に処理します。
最後のポイントは、テキストベースの出力を行うのに役立つ API が他にもあるということです。
- この
BufferedWriter
クラス (および もBufferedOutputStream
) は、出力プロセスにインメモリ バッファリングを導入することにより、効率的な出力をサポートします。これにより、システム コールが節約されます。特に、小規模な書き込み操作を多数実行している場合はそうです。
- この
PrintWriter
クラスは便利なメソッドを多数提供し、IOExceptions を処理する必要もありません。(IOException が発生した場合、PrintWriter
はそれを記録します。例外が発生したかどうかをテストする方法があります。これは、何をしているかに応じて、有用または危険になる可能性があります ...)