У мене є функція, яка приймає об'єкт певного типу і a, PrintStream
на який слід друкувати, і виводить представлення цього об'єкта. Як я можу зафіксувати вихід цієї функції в рядку? Зокрема, я хочу використовувати його як у toString
методі.
У мене є функція, яка приймає об'єкт певного типу і a, PrintStream
на який слід друкувати, і виводить представлення цього об'єкта. Як я можу зафіксувати вихід цієї функції в рядку? Зокрема, я хочу використовувати його як у toString
методі.
Відповіді:
Використовуйте 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);
PrintStream ps = new PrintStream(baos,true,"utf-8");
щоб уникнути хаосу-шаре
new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);
доступну з 1.7 , не кидає
ByteArrayOutputStream.close()
" не має ефекту ", оскільки немає жодного ресурсу, окрім резервного масиву, яким буде займатися смітник.
ByteArrayOutputStream
має toString(String charsetName)
, але приймає лише аргумент String. Також зауважте, що ByteArrayOutputStream синхронізовано , що, мабуть, не бажано
Ви можете сконструювати PrintStream за допомогою ByteArrayOutputStream, переданого в конструктор, який згодом ви можете використовувати для захоплення тексту, записаного в PrintStream.
ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");
Уніфікація попередніх відповідей, ця відповідь працює з 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();
Можливо, це питання може вам допомогти: Введіть OutputStream в рядок
Підклас OutputStream і загортаємо його в PrintStream
Визначте та ініціалізуйте змінну Scanner з ім'ям inSS, яка створює потік вхідних рядків за допомогою змінної String myStrLine.
Відповідь: Сканер inSS = новий сканер (myStrLine);