web-dev-qa-db-ja.com

出力ストリームに文字列を書き込む

OutputStreamを実装している出力リスナーがいくつかあります。 PrintStreamがstdoutまたはFileに書き込んでいるか、あるいはメモリまたはその他の出力先に書き込んでいる可能性があります。そのため、メソッドの引数としてOutputStreamを指定しました。

今、私は文字列を受け取りました。ここでストリームに書き込むための最良の方法は何ですか?

単にWriter.write(message.getBytes())を使うべきですか?バイト数を指定できますが、宛先ストリームが文字ストリームの場合は自動的に変換されますか?

代わりにここでブリッジストリームを使用する必要がありますか?

125
yart

ストリーム(InputStreamおよびOutputStream)はバイナリデータを転送します。文字列をストリームに書きたい場合は、まずそれをバイトに変換するか、言い換えるとencodeそれをエンコードする必要があります。 String.getBytes(Charset)メソッドを使って(あなたが提案するように)手動でそれを行うことができますが、String.getBytes()メソッドは避けるべきです。なぜならそれはJVMのデフォルトのエンコーディングを使うからです。

ただし、文字データをストリームに書き込む通常の方法は、ストリームを Writer 、(多くの場合、 PrintWriter )でラップすることです。その write(String) (または print(String) )メソッドを呼び出します。 InputStreamsに対応するラッパーは、 Reader です。

PrintStreamは、文字列を自動的にエンコードするメソッドも含むという意味で、特別なOutputStreamの実装です(内部的にはライターを使用します)。しかし、それはまだ流れです。 PrintStreamやその他のストリーム実装であっても、ストリームをライターで安全にラップできます。ダブルエンコーディングの危険性はありません。

OutputStreamを使用したPrintWriterの例:

try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
    p.println("Hello");
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
}
141
MForster

OutputStreamはバイトを書き込み、Stringは文字を提供します。文字列をbyte []に​​エンコードするようにCharsetを定義する必要があります。

outputStream.write(string.getBytes(Charset.forName("UTF-8")));

UTF-8を選択した文字セットに変更します。

97
Peter Knego

あなたはあなたのOutputStreamをラップするPrintStreamを作成し、それからそれをprint(String)と呼ぶことができます。

final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();
32

設計上 このようにすることです。

OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
    w.write("Hello, World!");
} // or w.close(); //close will auto-flush
15
Antonio

OutputStreamを PrintWriter で囲み、そのクラスのprintメソッドを使用します。彼らは文字列を受け取り、あなたのために仕事をします。

12
NG.

あなたは Apache Commons IO を使うことができます。

try (OutputStream outputStream = ...) {
    IOUtils.write("data", outputStream, "UTF-8");
}
8
Felix