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.