Re: TeeOutputStream?
On Sat, 04 Jun 2011 17:17:04 -0700, Knute Johnson
<nospam@knutejohnson.com> wrote:
I'm working on a project where I need to send the same data to two
OutputStreams so I went snooping around on the net for some code to
snatch. Most of the examples I found had what I think is a significant
flaw. That is if for example the write() method looks like this;
public void write(byte b) throws IOException {
os1.write(b);
os2.write(b);
}
if OutputStream os1 throws an IOException, no attempt to write the data
to os2 will happen. This probably isn't too big a concern for writes
but what about close()?
public void close() throws IOException {
os1.close();
os2.close();
}
If os1 throws an IOException on the close() method, then os2's close()
method will never get executed possibly leaving the stream open and the
attached resources still around. What about;
public void close() throws IOException {
try {
os1.close();
} finally {
os2.close();
}
}
This guarantees that both close() methods will get called. If both
methods throw IOExceptions the caller will never see the first one as it
will be hidden.
What do you think? Have I completely over thought this?
Thanks,
Given a new class, DoubleIOException, to hold two exceptions, this
seems to work.
rossum
// ---- Start Code ----
public void close() throws IOException {
IOException firstFail = null;
IOException secondFail = null;
try {
try {
os1.close();
} catch (IOException ioe1) {
firstFail = ioe1;
logger.log(Level.SEVERE,
"First stream failure IOexception", ioe1);
}
try {
os2.close();
} catch (IOException ioe2) {
secondFail = ioe2;
logger.log(Level.SEVERE,
"Second stream failure IOexception", ioe2);
}
} finally {
if (firstFail != null) {
if (secondFail != null) {
// Deal with double failure.
throw new DoubleIOException(firstFail, secondFail);
} else {
// Deal with first only failure.
throw firstFail;
}
} else {
if (secondFail != null) {
// Deal with second only failure.
throw secondFail;
}
}
}
}