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);

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);

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.