Java: PrintStream в строку?

115

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

Ник Хайнер
источник

Ответы:

193

Используйте 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);
ChssPly76
источник
10
Не забудьте закрыть PrintStream, чтобы освободить все ресурсы.
tobr
9
Я бы посоветовал использовать, PrintStream ps = new PrintStream(baos,true,"utf-8");чтобы избежать хаоса кодировки
доктор Макс Фёлькель
5
Использование new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);доступно с
версии
2
@tobr, безусловно, хорошее эмпирическое правило, но ByteArrayOutputStream.close()«не имеет никакого эффекта », так как нет никаких ресурсов, которые можно было бы освободить, кроме резервного массива, который будет обрабатываться сборщиком мусора.
dimo414 05
ByteArrayOutputStreamимеет toString(String charsetName), но принимает только аргумент String. Также обратите внимание, что ByteArrayOutputStream синхронизирован , что, вероятно, нежелательно
не паникуйте
31

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

ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");
Асаф
источник
5

Объединяя предыдущие ответы, этот ответ работает с 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();
Келан Данстар
источник
-3

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

Ответ: Scanner inSS = new Scanner (myStrLine);

user7805633
источник