Java: PrintStream в строку?

У меня есть функция, которая принимает объект определенного типа и PrintStream для печати и выводит представление этого объекта. Как я могу зафиксировать вывод этой функции в строку? В частности, я хочу использовать его как метод toString.


person Nick Heiner    schedule 19.11.2009    source источник


Ответы (6)


Используйте ByteArrayOutputStream в качестве буфера:

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;

    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final String utf8 = StandardCharsets.UTF_8.name();
    try (PrintStream ps = new PrintStream(baos, true, utf8)) {
        yourFunction(object, ps);
    }
    String data = baos.toString(utf8);
person ChssPly76    schedule 19.11.2009
comment
Не забудьте закрыть PrintStream, чтобы освободить все ресурсы. - person tobr; 20.06.2012
comment
Используйте new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);, доступный начиная с 1.7, он не выдает - person earcam; 16.02.2016
comment
@tobr, безусловно, хорошее эмпирическое правило, но ByteArrayOutputStream.close() не имеет никакого эффекта, так как нет ресурсов для освобождения, кроме резервного массива, с которым будет работать сборщик мусора. - person dimo414; 05.06.2016
comment
ByteArrayOutputStream имеет toString(String charsetName), но принимает только строковый аргумент. Также обратите внимание, что ByteArrayOutputStream синхронизируется, что, вероятно, нежелательно. - person don't panic; 29.11.2018

Вы можете создать PrintStream с помощью ByteArrayOutputStream, переданного в конструктор, который впоследствии можно использовать для захвата текста, записанного в PrintStream.

ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");
person Asaph    schedule 19.11.2009

Почему бы вам не использовать StringWriter с PrintWriter?

StringWriter writer = new StringWriter();
PrintWriter out = new PrintWriter(writer);
out.println("Hello World!");
String output = writer.toString();
person Clebert Suconic    schedule 21.10.2011
comment
Помимо ответа с самым высоким рейтингом, этот не беспокоит вас charsetName. - person andrey; 11.03.2012
comment
Это не сработает. Вы не можете передать PrintWriter в функцию, которая принимает только PrintStream в качестве аргумента, о чем и был вопрос. - person Alderath; 06.07.2012
comment
Я дал это как предложение по замене PrintStream. Обычно это хороший выбор. Если вы должны использовать PrintStream, то это определенно не выбор. (Я не уверен, почему кто-то проголосовал бы за это -1 ... в большинстве случаев это все еще технически жизнеспособный вариант :)) - person Clebert Suconic; 12.04.2013

Объединение предыдущих ответов, этот ответ работает с Java 1.7 и более поздними версиями. Кроме того, я добавил код для закрытия Streams.

final Charset charset = StandardCharsets.UTF_8;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos, true, charset.name());
yourFunction(object, ps);
String content = new String(baos.toByteArray(), charset);
ps.close();
baos.close();
person Kaelan Dawnstar    schedule 19.09.2017

Возможно, вам поможет этот вопрос: Получить OutputStream в строку

Подкласс OutputStream и оберните его в PrintStream

person Kamil Szot    schedule 19.11.2009

Определите и инициализируйте переменную Scanner с именем inSS, которая создает поток входных строк, используя переменную String myStrLine.

Ответ: Сканер inSS = новый сканер (myStrLine);

person user7805633    schedule 02.04.2017