繁体   English   中英

Java中的printf()功能与CharBuffer或类似的东西结合在一起

[英]printf() functionality in Java combined with a CharBuffer or something like it

我在这里有些困惑。

我想做这样的事情:

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

看起来在StringWriter周围包裹一个PrintWriter可以为上面的sb对象做我想要的事情,除了没有clear()方法。 我想每次循环时都可以创建一个新的PrintWriter和StringWriter对象,但这似乎很痛苦。 (在我的真实代码中,我在多个位置执行此操作,而不仅仅是一次循环...)

我也大量使用了java.nio.CharBuffer和其他NIO缓冲区,这似乎是一种很有前途的方法,但是我不确定如何用可以给我提供printf()功能的对象包装它们。

有什么建议吗?

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

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

如果您真的想实现自己的SuperBuffer,那就没有那么难了。 只需使用clear()函数创建OutputStream的子类,然后将PrintStream包装在其周围即可。 如果需要,可以在超级缓冲区中使用CharBuffer。

考虑创建一个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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM