Потоки ( InputStreamі OutputStream) передають двійкові дані. Якщо ви хочете записати рядок у потік, спершу слід перетворити його в байти або іншими словами кодувати його. Це можна зробити вручну (як ви пропонуєте), використовуючи String.getBytes(Charset)метод, але слід уникати String.getBytes()методу, оскільки для цього використовується кодування за замовчуванням JVM, яке неможливо надійно передбачити портативно.
Звичайний спосіб записувати символьні дані в потік - це загортати потік у Writer(часто а PrintWriter), який робить перетворення для вас, коли ви викликаєте його write(String)(або print(String)) метод. Відповідна обгортка для InputStreams є Reader .
PrintStreamце спеціальна OutputStreamреалізація в тому сенсі, що вона також містить методи, які автоматично кодують рядки (він використовує записувач всередині). Але це все-таки струмок. Ви можете безпечно обернути свій потік автором, незалежно від того, чи це PrintStreamінша реалізація потоку. Немає небезпеки подвійного кодування.
Приклад PrintWriter з OutputStream:
try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
p.println("Hello");
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}