функциональность printf() в Java в сочетании с буфером символов или чем-то подобным

StackOverflow https://stackoverflow.com/questions/407026

  •  03-07-2019
  •  | 
  •  

Вопрос

Я здесь немного сбит с толку.

Я бы хотел сделать что-то вроде этого:

  1. создайте какой-нибудь буфер, в который я могу записывать данные
  2. очистить буфер
  3. используйте функцию, подобную printf (), несколько раз, чтобы добавить кучу вещей в буфер на основе некоторых сложных вычислений, которые я хочу выполнить только один раз
  4. используйте содержимое буфера и распечатайте его в нескольких PrintStream Объекты
  5. при необходимости повторите шаги 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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top