Java: PrintStream на рядок?


115

У мене є функція, яка приймає об'єкт певного типу і a, 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, щоб звільнити всі ресурси.
— тобр

9
Я б запропонував використати, PrintStream ps = new PrintStream(baos,true,"utf-8");щоб уникнути хаосу-шаре
— доктор Макс Вьолкель

5
Використовуйте new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);доступну з 1.7 , не кидає
— earcam

2
@tobr, безумовно, хороше правило, але ByteArrayOutputStream.close()" не має ефекту ", оскільки немає жодного ресурсу, окрім резервного масиву, яким буде займатися смітник.
— dimo414

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 і пізніше. Також я додав код, щоб закрити потоки.

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

Визначте та ініціалізуйте змінну Scanner з ім'ям inSS, яка створює потік вхідних рядків за допомогою змінної String myStrLine.

Відповідь: Сканер inSS = новий сканер (myStrLine);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.