【问题标题】:printf() functionality in Java combined with a CharBuffer or something like itJava 中的 printf() 功能与 CharBuffer 或类似的东西相结合
【发布时间】:2009-01-02 15:11:24
【问题描述】:

我有点困惑。

我想做这样的事情:

  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() 功能。

有什么建议吗?

【问题讨论】:

  • 你到底想要做什么,你在尝试什么,它是如何不起作用的?请澄清你的问题,我真的不明白。

标签: java stream printf


【解决方案1】:

啊:我想我明白了。 Formatter 类有一个类似于printf()format() 方法,它可以被构造为包裹任何实现Appendable 的对象。 CharBuffer实现了Appendable,我可以根据需要clear()或读出CharBuffer的内容。

【讨论】:

    【解决方案2】:

    为什么在循环中创建一个新缓冲区很痛苦?这就是垃圾收集器的用途。无论如何,都需要在 clear() 中进行新的分配。

    如果你真的想实现你的 SuperBuffer,那一点也不难。只需使用 clear() 函数创建 OutputStream 的子类,然后将 PrintStream 包装在其周围。如果需要,您可以在超级缓冲区中使用 CharBuffer。

    【讨论】:

      【解决方案3】:

      考虑创建一个 OutputStream(或 Writer)的子类 TeeOutputStream,它保存您的流数组并委托给它们。然后用 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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-23
        相关资源
        最近更新 更多