У меня есть функция, которая принимает объект определенного типа и объект PrintStreamдля печати, и выводит представление этого объекта. Как я могу записать вывод этой функции в строку? В частности, я хочу использовать его как toStringметод.
У меня есть функция, которая принимает объект определенного типа и объект 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);доступно с
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 и более поздними версиями. Также я добавил код для закрытия 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();
Возможно, этот вопрос может помочь вам: получить OutputStream в строке
Подкласс OutputStream и оберните его в PrintStream
Определите и инициализируйте переменную сканера с именем inSS, которая создает поток входной строки с помощью строковой переменной myStrLine.
Ответ: Scanner inSS = new Scanner (myStrLine);