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
Writer s 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
OutputStream s. |
void |
enableCopy(boolean[] enable)
Allow to switch off the copy to the underlying
OutputStream s, 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
Writer
s 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 Reader
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).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 Reader
destination
- 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 Reader
destination
- 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 Closeable
close
in interface AutoCloseable
close
in class Reader
IOException
close()
public final void enableCopy(boolean enable)
Allow to switch off the copy to the underlying
OutputStream
s. 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
OutputStream
s, 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
OutputStream
s.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 Reader
IOException
reset()
,
Reader.mark(int)
public boolean markSupported()
markSupported
in class Reader
public int read() throws IOException
read
in class Reader
IOException
public int read(char[] b, int off, int len) throws IOException
read
in class Reader
IOException
public 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 Reader
IOException
- If the source stream has an exception in calling
reset().mark(int)
,
Reader.reset()
Copyright © 2008–2016. All rights reserved.