Os fluxos ( InputStreame OutputStream) transferem dados binários . Se você deseja gravar uma sequência em um fluxo, primeiro deve convertê-la em bytes ou, em outras palavras, codificá- la. Você pode fazer isso manualmente (como sugere) usando o String.getBytes(Charset)método, mas evite o String.getBytes()método, porque ele usa a codificação padrão da JVM, que não pode ser prevista com segurança de maneira portátil.
A maneira usual de gravar dados de caracteres em um fluxo, no entanto, é agrupar o fluxo em um Writer(geralmente a PrintWriter), que faz a conversão quando você chama o método write(String)(ou print(String)). O wrapper correspondente para InputStreams é um Reader .
PrintStreamé uma OutputStreamimplementação especial no sentido de que também contém métodos que codificam automaticamente seqüências de caracteres (ele usa um gravador internamente). Mas ainda é um riacho. Você pode agrupar seu fluxo com segurança com um gravador, independentemente de ser uma PrintStreamou outra implementação de fluxo. Não há perigo de codificação dupla.
Exemplo de PrintWriter com OutputStream:
try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
p.println("Hello");
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}