我在这里有点困惑。
我想做这样的事情:
PrintStream对象例如:
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()功能。
有什么建议吗?
发布于 2009-01-02 15:23:39
阿:我想我知道了。Formatter类有一个类似于printf()的format()方法,它可以构造成环绕实现Appendable的任何类型的对象。CharBuffer实现Appendable,我可以根据需要clear()或读出CharBuffer的内容。
发布于 2009-01-02 15:23:40
为什么在循环中创建一个新的缓冲区很痛苦?垃圾收集器就是为了这个。无论如何,在掩护下需要有一个新的分配。
如果你真的想实现你的SuperBuffer,那就没那么难了。只需使用clear()函数创建一个OutputStream的子类,然后围绕它包装一个PrintStream。如果需要,可以在超级缓冲区中使用CharBuffer。
发布于 2009-01-03 01:46:13
考虑创建一个子类,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();
}https://stackoverflow.com/questions/407026
复制相似问题