Запись строки в выходной поток
У меня есть несколько выходных слушателей, которые реализуют 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 и используйте методы печати в этом классе. Они берут строку и выполняют работу за вас.
Ответ 6
Вы можете использовать Apache Commons IO:
try (OutputStream outputStream = ...) {
IOUtils.write("data", outputStream, "UTF-8");
}