Запись строки в выходной поток

У меня есть несколько выходных слушателей, которые реализуют OutputStream. Это может быть либо запись PrintStream в stdout, либо в файл, либо запись в память или любое другое назначение вывода; поэтому я определил в методе OutputStream как() аргумент метода.

Теперь я получил строку. Каков наилучший способ записи в потоки?

Должен ли я просто использовать Writer.write(message.getBytes())? Я могу дать ему байты, но если поток назначения будет символьным потоком, то он будет автоматически преобразован?

Нужно ли использовать здесь некоторые мостовые потоки?

Ответ 1

Потоки (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();
}

Ответ 2

OutputStream пишет байты, String предоставляет символы. Вы должны определить Charset для кодирования строки в байт []:

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

Измените UTF-8 на кодировку по вашему выбору.

Ответ 3

Вы можете создать печать PrintStream вокруг вашего OutputStream, а затем просто вызвать его print (String):

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

Ответ 4

По замыслу это должно быть сделано следующим образом:

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

Ответ 5

Оберните свой OutputStream с помощью PrintWriter и используйте методы печати в этом классе. Они берут строку и выполняют работу за вас.