Функциональность printf () в Java в сочетании с CharBuffer или чем-то подобным - PullRequest
0 голосов
/ 02 января 2009

Я немного запутался здесь.

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

  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());
}

Похоже, что обёртка PrintWriter вокруг StringWriter будет делать то, что я хочу для объекта sb, описанного выше, за исключением того, что нет метода clear(). Я полагаю, что я мог бы создавать новые объекты PrintWriter и StringWriter каждый раз в цикле, но это похоже на боль. (в моем реальном коде я делаю это в нескольких местах, а не один раз в одном цикле ...)

Я также часто использовал java.nio.CharBuffer и другие буферы NIO, и это кажется многообещающим подходом, но я не уверен, как можно обернуть их объектом, который даст мне printf() функциональность.

любой совет?

Ответы [ 3 ]

3 голосов
/ 02 января 2009

ах: я думаю, что понял. Класс Formatter имеет метод format(), который похож на printf(), и его можно сконструировать для обтекания любого типа объекта, реализующего Appendable. CharBuffer реализует Appendable, и я могу clear() или зачитать содержимое CharBuffer при необходимости.

1 голос
/ 02 января 2009

Почему трудно создать новый буфер в цикле? Вот для чего предназначен сборщик мусора. Во всяком случае, в clear () должно быть новое распределение под покровами.

Если вы действительно хотите реализовать свой супербуфер, это будет совсем не сложно. Просто создайте подкласс OutputStream с помощью функции clear (), а затем оберните PrintStream вокруг этого. Вы можете использовать CharBuffer в своем супер буфере, если хотите.

0 голосов
/ 03 января 2009

Рассмотрите возможность создания подкласса, 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();
}
...