Введіть рядок у вихідний потік


139

У мене є кілька вихідних слухачів, які реалізують OutputStream. Це може бути запис PrintStream до stdout або у файл, або це запис у пам'ять або будь-яке інше призначення виводу; Тому я вказав OutputStream як аргумент у методі.

Тепер я отримав Рядок. Який найкращий спосіб записати сюди потоки?

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

Чи потрібно замість цього використовувати деякі мостові потоки?


2
Я не впевнений, але це здається, що ви намагаєтесь винаходити колесо тут, ви переглядали API Java Base API, а також API Commons IO?
posdef

Відповіді:


149

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

3
Тож використання PrintWriter- це як використання String.getBytes(). Він використовує будь-яке випадкове кодування, яке, як відомо, є за замовчуванням JVM. Тож це працює лише у тому випадку, якщо пощастить.
Крістофер Хаммарстрем

106

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

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

Перейдіть UTF-8до набору за вашим вибором.


3
Додайте наступним рядком. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Сахіл Патель

32

Ви можете створити PrintStream, обертаючи навколо OutputStream, а потім просто зателефонувати його print (String):

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

2
Який набір символів використовує PrintStream для перетворення в байти?
Дін Гіллер


12

Оберніть OutputStream за допомогою PrintWriter і використовуйте методи друку цього класу. Вони беруть струну і виконують роботу за вас.


9

Ви можете використовувати AOche 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))), тож можливо, якщо закодована рядок не може вміститися в байтовий масив
Šarūnas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.