У меня есть функция, которая принимает объект определенного типа и PrintStream
для печати и выводит представление этого объекта. Как я могу зафиксировать вывод этой функции в строку? В частности, я хочу использовать его как метод toString
.
Java: PrintStream в строку?
Ответы (6)
Используйте 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);
person
ChssPly76
schedule
19.11.2009
Не забудьте закрыть PrintStream, чтобы освободить все ресурсы.
- person tobr; 20.06.2012
Используйте
new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);
, доступный начиная с 1.7, он не выдает
- person earcam; 16.02.2016
@tobr, безусловно, хорошее эмпирическое правило, но
ByteArrayOutputStream.close()
не имеет никакого эффекта, так как нет ресурсов для освобождения, кроме резервного массива, с которым будет работать сборщик мусора.
- person dimo414; 05.06.2016
ByteArrayOutputStream
имеет toString(String charsetName)
, но принимает только строковый аргумент. Также обратите внимание, что ByteArrayOutputStream синхронизируется, что, вероятно, нежелательно.
- person don't panic; 29.11.2018
Вы можете создать PrintStream с помощью ByteArrayOutputStream, переданного в конструктор, который впоследствии можно использовать для захвата текста, записанного в PrintStream.
ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");
person
Asaph
schedule
19.11.2009
Почему бы вам не использовать StringWriter с PrintWriter?
StringWriter writer = new StringWriter();
PrintWriter out = new PrintWriter(writer);
out.println("Hello World!");
String output = writer.toString();
person
Clebert Suconic
schedule
21.10.2011
Помимо ответа с самым высоким рейтингом, этот не беспокоит вас charsetName.
- person andrey; 11.03.2012
Это не сработает. Вы не можете передать PrintWriter в функцию, которая принимает только PrintStream в качестве аргумента, о чем и был вопрос.
- person Alderath; 06.07.2012
Я дал это как предложение по замене PrintStream. Обычно это хороший выбор. Если вы должны использовать PrintStream, то это определенно не выбор. (Я не уверен, почему кто-то проголосовал бы за это -1 ... в большинстве случаев это все еще технически жизнеспособный вариант :))
- person Clebert Suconic; 12.04.2013
Объединение предыдущих ответов, этот ответ работает с 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();
person
Kaelan Dawnstar
schedule
19.09.2017
Возможно, вам поможет этот вопрос: Получить OutputStream в строку
Подкласс OutputStream и оберните его в PrintStream
person
Kamil Szot
schedule
19.11.2009
Определите и инициализируйте переменную Scanner с именем inSS, которая создает поток входных строк, используя переменную String myStrLine.
Ответ: Сканер inSS = новый сканер (myStrLine);
person
user7805633
schedule
02.04.2017