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


139

OutputStreamを実装しているいくつかの出力リスナーがあります。これは、標準出力またはファイルに書き込むPrintStreamにすることも、メモリやその他の出力先に書き込むこともできます。したがって、メソッドの引数としてOutputStreamを指定しました。

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

Writer.write(message.getBytes())を使用する必要がありますか?バイトを与えることはできますが、宛先ストリームが文字ストリームの場合、自動的に変換されますか?

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


2
確かではありませんが、ここでホイールを再発明しようとしているようです。JavaBase APIとCommons IO APIを調べましたか?
posdef 2010年

回答:


149

ストリーム(InputStreamおよびOutputStream)はバイナリデータを転送します。文字列をストリームに書き込む場合は、まず文字列をバイトに変換するか、つまりエンコードする必要があります。String.getBytes(Charset)メソッドを使用して手動で(推奨どおり)実行できますString.getBytes()が、移植可能な方法で確実に予測できないJVMのデフォルトのエンコーディングを使用するため、メソッドは使用しないでください。

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

PrintStreamOutputStream文字列を自動的にエンコードするメソッドも含まれているという意味で特別な実装です(内部的にライターを使用します)。しかし、それはまだストリームです。ストリームがPrintStream他のストリーム実装であるかどうかに関係なく、ライターでストリームを安全にラップできます。二重エンコードの危険はありません。

OutputStreamを使用したPrintWriterの例:

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

3
したがって、を使用するのPrintWriterはを使用するのと同じString.getBytes()です。JVMのデフォルトであるランダムエンコーディングを使用します。だから、あなたが運がよければそれだけが機能します。
ChristofferHammarström18年

106

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

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

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


3
次の行を追加します。ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Sahil Patel 2017

32

OutputStreamをラップするPrintStreamを作成して、それをprint(String)と呼ぶだけです。

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

2
PrintStreamがバイトに変換するために使用している文字セットは何ですか?
ディーンヒラー2016年

20

仕様では、次のように行われます。

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

3
w.close()閉じますout同様。
フランクリンユー

12

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


9

Apache Commons IOを使用できます。

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

IOUtils.write(String data, OutputStream output, Charset encoding)実装されoutput.write(data.getBytes(Charsets.toCharset(encoding)))、それがエンコードされた文字列をバイト配列に収まらない可能性がある場合に、
サルナス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.