Записать строку в выходной поток - PullRequest
126 голосов
/ 01 ноября 2010

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

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

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

Нужно ли вместо этого использовать несколько мостовых потоков?

Ответы [ 6 ]

143 голосов
/ 01 ноября 2010

Потоки (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();
}
98 голосов
/ 01 ноября 2010

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

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

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

32 голосов
/ 01 ноября 2010

Вы можете создать PrintStream, обертывающий ваш OutputStream, а затем просто вызвать его print (String):

final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();
15 голосов
/ 04 ноября 2015

По замыслу это должно быть сделано так:

OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
    w.write("Hello, World!");
} // or w.close(); //close will auto-flush
12 голосов
/ 01 ноября 2010

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

8 голосов
/ 08 апреля 2016

Вы можете использовать Apache Commons IO :

try (OutputStream outputStream = ...) {
    IOUtils.write("data", outputStream, "UTF-8");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...