1. ホーム
  2. java

[解決済み] 出力ストリームに文字列を書き込む

2022-04-26 21:31:08

質問

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

今、私が受け取ったのは String . ここでストリームに書き込むには、どのような方法があるのでしょうか?

を使用すればよいのでしょうか? Writer.write(message.getBytes()) ? バイトを渡すことはできますが、宛先ストリームが文字ストリームの場合、自動的に変換されるのでしょうか?

この場合、ブリッジストリームを使用する必要があるのでしょうか?

どのように解決するのですか?

ストリーム( InputStreamOutputStream ) 転送 バイナリ のデータを使用します。文字列をストリームに書き込む場合、まず文字列をバイトに変換する必要があります、つまり エンコード となります。これを手動で行うには、(あなたが提案するように) String.getBytes(Charset) メソッドを使用するのは避けるべきですが String.getBytes() なぜなら、このメソッドはJVMのデフォルトエンコーディングを使用しており、移植可能な方法で確実に予測することができないからです。

しかし、ストリームに文字データを書き込む通常の方法は、ストリームを Writer は、(多くの場合 PrintWriter を呼び出すと、その変換を行います。 write(String) (または print(String) ) メソッドを使用します。InputStreamsに対応するラッパーは リーダー .

PrintStream は、特殊な OutputStream の実装は、文字列を自動的にエンコードするメソッドも含んでいます (内部でライターを使用しています)。しかし、これはストリームであることに変わりはない。であろうと、ライタでストリームを安全にラップすることができます。 PrintStream または他のストリーム実装を使用することができます。二重エンコーディングの危険はありません。

PrintWriterとOutputStreamの組み合わせの例です。

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