У меня есть функция, которая принимает объект определенного типа и объект 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);