функциональность printf() в Java в сочетании с буфером символов или чем-то подобным
Вопрос
Я здесь немного сбит с толку.
Я бы хотел сделать что-то вроде этого:
- создайте какой-нибудь буфер, в который я могу записывать данные
- очистить буфер
- используйте функцию, подобную printf (), несколько раз, чтобы добавить кучу вещей в буфер на основе некоторых сложных вычислений, которые я хочу выполнить только один раз
- используйте содержимое буфера и распечатайте его в нескольких
PrintStream
Объекты - при необходимости повторите шаги 2-4
например ,:
SuperBuffer sb = new SuperBuffer();
/* SuperBuffer is not a real class, so I don't know what to use here */
PrintStream[] streams = new PrintStream[N];
/* ... initialize this array to several streams ... */
while (!done)
{
sb.clear();
sb.printf("something %d something %d something %d",
value1, value2, value3);
if (some_complicated_condition())
sb.printf("something else %d something else %d", value4, value5);
/* ... more printfs to sb ... */
for (PrintStream ps : streams)
ps.println(sb.getBuffer());
}
Это похоже на обертывание Печатающий автор вокруг Строковый сценарист буду делать то, что я хочу для sb
объект выше, за исключением того, что там нет clear()
способ.Я полагаю, я мог бы создавать новые объекты PrintWriter и StringWriter каждый раз через цикл, но это кажется сложной задачей.(в моем реальном коде я делаю это в нескольких местах, а не только один раз за один цикл ...)
Я также использовал java.nio.CharBuffer
и других буферов NIO много, и это кажется многообещающим подходом, но я не уверен, как я могу обернуть их объектом, который даст мне printf()
функциональность.
есть какой-нибудь совет?
Решение
ах:Кажется, у меня получилось.Тот Самый Formatter
класс имеет format()
метод, который похож printf()
, и он может быть сконструирован для обертывания вокруг любого объекта , который реализует Appendable
. CharBuffer
орудия труда Appendable
, и я могу clear()
или зачитайте содержание CharBuffer
по мере необходимости.
Другие советы
Почему так сложно создавать новый буфер в цикле?Вот для чего существует сборщик мусора.В любом случае, в clear() должно быть новое распределение под обложками.
Если вы действительно хотите реализовать свой супербуфер, это будет совсем не так сложно.Просто создайте подкласс OutputStream с функцией clear(), а затем оберните вокруг нее PrintStream.Вы могли бы использовать CharBuffer в вашем супербуфере, если бы захотели.
Рассмотрите возможность создания подкласса TeeOutputStream OutputStream (или Writer), который содержит ваш массив потоков и делегирует им полномочия.Затем оберните свой поток с помощью PrintStream (или PrintWriter) и просто вызовите printf() для него.Нет необходимости во временном буфере или чем-то еще:
PrintStream[] streams = new PrintStream[N]; // any output streams really
PrintStream ps = new PrintStream(new TeeOutputStream(streams));
while (!done)
{
ps.printf("something %d something %d something %d",
value1, value2, value3);
if (some_complicated_condition())
ps.printf("something else %d something else %d", value4, value5);
ps.println();
}