ストリーム(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();
}