Java让PrintWriter写两个不同的Writer

Fir*_*cer 1 java io

我正在重构一些代码,并希望制作一个PrintWriter,将输出发送到两个单独的Writer(而不是流,它们最终会转到不同的地方,其中一个可能有其他东西从其他地方发送到它).

对于流有Apache TeeOutputStream,是否有什么适用于Writer或我需要通过流和返回文本?

icz*_*cza 5

标准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因为多个"孩子"作家可能很容易失败.