我正在重构一些代码,并希望制作一个PrintWriter,将输出发送到两个单独的Writer(而不是流,它们最终会转到不同的地方,其中一个可能有其他东西从其他地方发送到它).
对于流有Apache TeeOutputStream,是否有什么适用于Writer或我需要通过流和返回文本?
标准Java库中没有这样的"多写器",但您可以非常轻松地创建它.之所以"容易",是因为只有3个abstract方法java.io.Writer:close(),flush()和write(char[] cbuf, int off, int len).
write()方法的所有其他重载的默认实现调用此抽象方法.
您只需存储要转发的编写器并执行此操作:转发这三种抽象方法的调用:
class MultiWriter extends Writer {
private final Writer[] writers;
public MultiWriter(Writer... writers) {
this.writers = writers;
}
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
for (Writer w : writers)
w.write(cbuf, off, len);
}
@Override
public void flush() throws IOException {
for (Writer w : writers)
w.flush();
}
@Override
public void close() throws IOException {
for (Writer w : writers)
w.close();
}
};
Run Code Online (Sandbox Code Playgroud)
注意:
我知道你想要一个PrintWriter,但既然我们MultiWriter是一个java.io.Writer,你可以简单地将它传递给PrintWriter这样的:
PrintWriter pw = new PrintWriter(new MultiWriter(writer1, writer2));
Run Code Online (Sandbox Code Playgroud)
笔记2:
在我的实现中,我没有捕获我们转发的作者抛出的异常.例如,如果write()一个"孩子"作家的方法会抛出一个IOException,即使我们成功写入其他作者,失败的那个仍将失败......如果我们想要处理个别异常,我们将不得不实施一个新的IOException,可以容纳其他人的集合,IOException因为多个"孩子"作家可能很容易失败.