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.