public class TeeReaderWriter extends Reader
Copies the data from the underlying Reader to the
Writer(s) passed in the constructor. The data copied are
similar to the underlying Reader.
When the method is invoked all the bytes
remaining in the underlying close()Reader are copied to the
Writer(s). This behavior is different from this class and
TeeInputStream in Apache commons-io.
Bytes skipped are in any case copied to the Writer. Mark and
reset of the outer Reader doesn't affect the data copied to
the Writer(s), that remain similar to the Reader
passed in the constructor.
It also calculate some statistics on the read/write operations.
getWriteTime() returns the time spent writing to the Writers,
getReadTime() returns the time spent reading from the Reader and
getWriteSize() returns the amount of data written
to a single Writer until now.
Sample usage:
Reader source=... //some data to be read.
StringWriter destination1= new StringWriter();
StringWriter destination2= new StringWriter();
TeeReaderWriter tee = new TeeReaderWriter(source,destination1);
org.apache.commons.io.IOUtils.copy(tee,destination2);
tee.close();
//at this point both destination1 and destination2 contains the same bytes
//in destination1 were put by TeeReaderWriter while in
//destination2 they were copied by IOUtils.
StringBuffer buffer=destination1.getBuffer();
TeeReader| Modifier and Type | Field and Description |
|---|---|
protected boolean |
closeStreams
|
protected boolean[] |
copyEnabled |
protected Writer[] |
destinations
The destination
Writers where data is written. |
protected Reader |
source
The source
Reader where the data comes from. |
| Constructor and Description |
|---|
TeeReaderWriter(Reader source,
boolean closeStreams,
Writer... destinations)
Creates a
TeeInputStreamWriter and saves its argument, the
input stream source and the output stream
destination for later use. |
TeeReaderWriter(Reader source,
Writer destination)
Creates a
TeeReaderWriter and saves its argument, the
input stream source and the Writer
destination for later use. |
TeeReaderWriter(Reader source,
Writer destination,
boolean closeStreams)
Creates a
TeeReaderWriter and saves its argument, the
input stream source and the output stream
destination for later use. |
| Modifier and Type | Method and Description |
|---|---|
void |
close() |
void |
enableCopy(boolean enable)
Allow to switch off the copy to the underlying
OutputStreams. |
void |
enableCopy(boolean[] enable)
Allow to switch off the copy to the underlying
OutputStreams, selectively enabling or disabling copy to
some specific stream. |
long |
getReadTime()
Returns the number of milliseconds spent reading from the
source Reader. |
long |
getWriteSize()
Returns the number of bytes written until now to a single destination
Writer. |
long[] |
getWriteTime()
Return the time spent writing on the destination
Writer(s)
in milliseconds. |
void |
mark(int readLimit) |
boolean |
markSupported() |
int |
read() |
int |
read(char[] b,
int off,
int len) |
void |
reset() |
protected final boolean closeStreams
protected final boolean[] copyEnabled
protected final Writer[] destinations
Writers where data is written.protected final Reader source
Reader where the data comes from.public TeeReaderWriter(Reader source, boolean closeStreams, Writer... destinations)
Creates a TeeInputStreamWriter and saves its argument, the
input stream source and the output stream
destination for later use.
This constructor allow to specify multiple Writer to which
the data will be copied.
source - The underlying ReadercloseStreams - if true the destination will be
closed when the close() method is invoked. If
false the close method on the underlying
streams will not be called (it must be invoked externally).destinations - Data read from source are also written to this
Writer.public TeeReaderWriter(Reader source, Writer destination)
Creates a TeeReaderWriter and saves its argument, the
input stream source and the Writer
destination for later use.
When the method close() it is invoked the remaining content of
the source stream is copied to the
destination and the source and
destination streams are closed.
source - The underlying Readerdestination - Data read from source are also written to this
Writer.public TeeReaderWriter(Reader source, Writer destination, boolean closeStreams)
TeeReaderWriter and saves its argument, the
input stream source and the output stream
destination for later use.source - The underlying Readerdestination - Data read from source are also written to this
Writer.closeStreams - if true the destination will be
closed when the close() method is invoked. If
false the close method on the underlying
streams will not be called (it must be invoked externally).public void close()
throws IOException
This method is called when the method close() is invoked. It
copies all the data eventually remaining in the source
Reader passed in the constructor to the destination
Writer.
The standard behavior is to close both the underlying
Reader and Writer(s). When the class was
constructed with the parameter closeStreams
set to false the underlying streams must be closed
externally.
close in interface Closeableclose in interface AutoCloseableclose in class ReaderIOExceptionclose()public final void enableCopy(boolean enable)
Allow to switch off the copy to the underlying
OutputStreams. Setting the parameter to false will disable
the copy to all the underlying streams at once.
If you need more fine grained control you should use
enableCopy(boolean[]) .
enable - whether to copy or not the bytes to the underlying stream.public final void enableCopy(boolean[] enable)
Allow to switch off the copy to the underlying
OutputStreams, selectively enabling or disabling copy to
some specific stream.
The copy is enabled by default. Each element in the array correspond to
an OutputStream passed in the constructor. If the
correspondent element in the array passed as a parameter is set to
true the copy will be enabled. It can be invoked multiple
times.
enable - whether to copy or not the bytes to the underlying
OutputStreams.public long getReadTime()
Returns the number of milliseconds spent reading from the
source Reader.
source .public long getWriteSize()
Returns the number of bytes written until now to a single destination
Writer.
This number is not affected by any of the mark and reset that are made on this TeeReaderWriter and reflects only the number of bytes written.
destination.public long[] getWriteTime()
Return the time spent writing on the destination Writer(s)
in milliseconds.
The returned array has one element for each Writer passed
in the constructor.
Writers.public void mark(int readLimit)
throws IOException
Marks the current position in this input stream. A subsequent call to
the reset method repositions this stream at the last
marked position so that subsequent reads re-read the same bytes.
mark in class ReaderIOExceptionreset(),
Reader.mark(int)public boolean markSupported()
markSupported in class Readerpublic int read()
throws IOException
read in class ReaderIOExceptionpublic int read(char[] b,
int off,
int len)
throws IOException
read in class ReaderIOExceptionpublic void reset()
throws IOException
Repositions this stream to the position at the time the
mark method was last called on this input stream.
After reset() method is called the data is not copied
anymore to the destination Writer until the position where
reset was issued is reached again. This ensures the data
copied to the destination Writer reflects the data
contained in the source Reader (the one passed in the constructor).
reset in class ReaderIOException - If the source stream has an exception in calling
reset().mark(int),
Reader.reset()Copyright © 2008–2016. All rights reserved.