У меня есть несколько слушателей вывода, которые реализуют OutputStream. Это может быть либо запись PrintStream в стандартный вывод или файл, либо запись в память или любое другое место назначения вывода; поэтому я указал OutputStream как () аргумент в методе.
Теперь я получил строку. Как лучше всего писать здесь в потоки?
Должен ли я просто использовать Writer.write (message.getBytes ())? Я могу передать ему байты, но если целевой поток является символьным, будет ли он преобразован автоматически?
Нужно ли мне вместо этого использовать мостовые потоки?
Ответы:
Потоки (
InputStream
иOutputStream
) передают двоичные данные. Если вы хотите записать строку в поток, вы должны сначала преобразовать ее в байты или, другими словами, закодировать ее. Вы можете сделать это вручную (как вы предлагаете), используяString.getBytes(Charset)
метод, но вам следует избегать этогоString.getBytes()
метода, поскольку он использует кодировку JVM по умолчанию, которую нельзя надежно предсказать переносимым способом.Однако обычный способ записи символьных данных в поток - это заключить поток в объект
Writer
(часто aPrintWriter
), который выполняет преобразование за вас, когда вы вызываете его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(); }
источник
PrintWriter
похоже на использованиеString.getBytes()
. Он использует любую случайную кодировку, которая является значением JVM по умолчанию. Так что это работает, только если вам повезет.OutputStream записывает байты, String предоставляет символы. Вам необходимо определить Charset для кодирования строки в byte []:
outputStream.write(string.getBytes(Charset.forName("UTF-8")));
Измените
UTF-8
кодировку по вашему выбору.источник
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
.getBytes(StandardCharsets.UTF_8)
немного чищеВы можете создать оболочку PrintStream вокруг OutputStream, а затем просто вызвать ее print (String):
final OutputStream os = new FileOutputStream("/tmp/out"); final PrintStream printStream = new PrintStream(os); printStream.print("String"); printStream.close();
источник
По замыслу это делается так:
OutputStream out = ...; try (Writer w = new OutputStreamWriter(out, "UTF-8")) { w.write("Hello, World!"); } // or w.close(); //close will auto-flush
источник
w.close()
тоже закроетсяout
.Оберните свой OutputStream в PrintWriter и используйте методы печати этого класса. Они принимают String и делают всю работу за вас.
источник
Вы можете использовать Apache Commons IO :
try (OutputStream outputStream = ...) { IOUtils.write("data", outputStream, "UTF-8"); }
источник
IOUtils.write(String data, OutputStream output, Charset encoding)
реализован какoutput.write(data.getBytes(Charsets.toCharset(encoding)))
, поэтому может, если закодированная строка не помещается в массив байтов