我重构了一些代码,并想使一个PrintWriter,将输出发送到两个不同的作家(不流,他们最终去不同的地方,其中一人可能有从其他地方发送给它的其他的东西)。
对于流有Apache的TeeOutputStream,是有什么作家或者我需要通过流去和回短信?
我重构了一些代码,并想使一个PrintWriter,将输出发送到两个不同的作家(不流,他们最终去不同的地方,其中一人可能有从其他地方发送给它的其他的东西)。
对于流有Apache的TeeOutputStream,是有什么作家或者我需要通过流去和回短信?
有没有这样的“multiwriter”在标准的Java库,但你可以非常容易地创建一个。 其原因“容易”,是因为仅存在3个abstract
的方法java.io.Writer
: close()
, flush()
和write(char[] cbuf, int off, int len)
在所有其他重载的默认实现write()
方法调用这个抽象的。
你只需要存储要转发并做到这一点的作家:转发的这3种抽象方法的调用:
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();
}
};
注意:
我知道你想要一个PrintWriter
,但由于我们的MultiWriter
是java.io.Writer
,你可以简单地把它传递给PrintWriter
是这样的:
PrintWriter pw = new PrintWriter(new MultiWriter(writer1, writer2));
笔记2:
我在执行我没赶上由我们转发给作家抛出异常。 例如,如果在write()
“子”编剧将thow的方法IOException
,即使我们会成功写信给其他作家,失败的一个仍然会失败...如果我们想处理个别例外,我们必须实施新的IOException
,可以容纳其他的集合IOException
,因为多个“孩子”的作家可能会失败一样容易。
不难这种自己实现。 作家接口具有只是一个抽象方法屈指可数。 因此,像这样应该做的:
public class TeeWriter implements Writer {
private Writer w1, w2;
...
public void write(char[] cbuf, int off, int len) throws IOException {
IOException pending = null;
try {
w1.write(cbuf, off, len);
} catch(IOException e){
pending = e;
}
try {
w2.write(cbuf, off, len);
} catch(IOException e) {
if(null==pending) {
throw new IOException("Writing to w2 failed", e);
} else {
// unfortunately the error message for w1 is lost here, so maybe you can e.g. log it or append it to the string in the new one
throw new IOException("Writing to w1 and w2 failed", e);
}
}
if(null!=pending) {
throw new IOException("Writing to w1 failed", e);
}
}
...
}
其他方法将是similiar。