public class TeeInputStreamOutputStream extends AbstractInputStreamWrapper
Copies the data from the underlying InputStream
to the
OutputStream(s)
passed in the constructor. The data copied are
similar to the underlying InputStream
.
When the method
is invoked all the bytes
remaining in the underlying AbstractInputStreamWrapper.close()
InputStream
are copied to the
OutputStream(s)
. This behavior is different from this class
and TeeInputStream
in Apache commons-io.
Bytes skipped are in any case copied to the OutputStream
. Mark
and reset of the outer InputStream
doesn't affect the data
copied to the OutputStream(s)
, that remain similar to the
InputStream
passed in the constructor.
It also calculate some statistics on the read/write operations.
getWriteTime()
returns the time spent writing to the
OutputStreams, getReadTime()
returns the time spent reading from
the InputStream and getWriteSize()
returns the amount of data written to a single OutputStream
until now.
Sample usage:
InputStream source=... //some data to be read. ByteArrayOutputStream destination1= new ByteArrayOutputStream(); ByteArrayOutputStream destination2= new ByteArrayOutputStream(); TeeInputStreamOutputStream tee= new TeeInputStreamOutputStream(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 TeeInputStreamOutputStream while in //destination2 they were copied by IOUtils. byte[] bytes=destination1.getBytes();
TeeInputStream
Modifier and Type | Field and Description |
---|---|
protected boolean |
closeStreams
If
true source and destination
streams are closed when AbstractInputStreamWrapper.close() is invoked. |
protected boolean[] |
copyEnabled |
protected OutputStream[] |
destinations
The destination
OutputStream where data is written. |
closeCalled, source
Constructor and Description |
---|
TeeInputStreamOutputStream(InputStream source,
boolean closeStreams,
OutputStream... destinations)
Creates a
TeeInputStreamOutputStream and saves its
argument, the input stream source and the output stream
destination for later use. |
TeeInputStreamOutputStream(InputStream source,
OutputStream destination)
Creates a
TeeOutputStream and saves its argument, the
input stream source and the OutputStream
destination for later use. |
TeeInputStreamOutputStream(InputStream source,
OutputStream destination,
boolean closeStreams)
Creates a
TeeOutputStream and saves its argument, the
input stream source and the output stream
destination for later use. |
Modifier and Type | Method and Description |
---|---|
int |
available() |
void |
closeOnce()
closeOnce
|
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. |
OutputStream[] |
getDestinationStreams()
Returns the
OutputStream (s) passed in the constructor. |
long |
getReadTime()
Returns the number of milliseconds spent reading from the
source InputStream . |
long |
getWriteSize()
Returns the number of bytes written until now to a single destination
OutputStream . |
long[] |
getWriteTime()
Return the time spent writing on the destination
OutputStream(s) in milliseconds. |
int |
innerRead(byte[] b,
int off,
int len)
innerRead
|
void |
mark(int readLimit) |
boolean |
markSupported() |
int |
read() |
void |
reset() |
close, read, skip
read
protected final boolean closeStreams
true
source
and destination
streams are closed when AbstractInputStreamWrapper.close()
is invoked.protected final boolean[] copyEnabled
protected final OutputStream[] destinations
OutputStream
where data is written.public TeeInputStreamOutputStream(InputStream source, boolean closeStreams, OutputStream... destinations)
Creates a TeeInputStreamOutputStream
and saves its
argument, the input stream source
and the output stream
destination
for later use.
This constructor allow to specify multiple OutputStream
to
which the data will be copied.
source
- The underlying InputStream
closeStreams
- if true
the destination
will be
closed when the AbstractInputStreamWrapper.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
OutputStream
.public TeeInputStreamOutputStream(InputStream source, OutputStream destination)
Creates a TeeOutputStream
and saves its argument, the
input stream source
and the OutputStream
destination
for later use.
When the method AbstractInputStreamWrapper.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 InputStream
destination
- Data read from source
are also written to this
OutputStream
.public TeeInputStreamOutputStream(InputStream source, OutputStream destination, boolean closeStreams)
TeeOutputStream
and saves its argument, the
input stream source
and the output stream
destination
for later use.source
- The underlying InputStream
destination
- Data read from source
are also written to this
OutputStream
.closeStreams
- if true
the destination
will be
closed when the AbstractInputStreamWrapper.close()
method is invoked. If
false
the close method on the underlying
streams will not be called (it must be invoked externally).public int available() throws IOException
available
in class InputStream
IOException
public void closeOnce() throws IOException
closeOnce
This method is called when the method AbstractInputStreamWrapper.close()
is invoked. It
copies all the data eventually remaining in the source
InputStream
passed in the constructor to the destination
OutputStream
.
The standard behavior is to close both the underlying
InputStream
and OutputStream(s)
. When the
class was constructed with the parameter
closeCalled
set to false
the underlying streams must be closed externally.
closeOnce
in class AbstractInputStreamWrapper
IOException
- if any error occurs reading the bytes.AbstractInputStreamWrapper.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 final OutputStream[] getDestinationStreams()
Returns the OutputStream
(s) passed in the constructor.
public long getReadTime()
Returns the number of milliseconds spent reading from the
source
InputStream
.
source
.public long getWriteSize()
Returns the number of bytes written until now to a single destination
OutputStream
.
This number is not affected by any of the mark and reset that are made on this TeeInputStreamOutputStream and reflects only the number of bytes written.
destination
.public long[] getWriteTime()
Return the time spent writing on the destination
OutputStream(s)
in milliseconds.
The returned array has one element for each OutputStream
passed in the constructor.
OutputStreams
.public int innerRead(byte[] b, int off, int len) throws IOException
innerRead
innerRead
in class AbstractInputStreamWrapper
b
- an array of byte.off
- a int.len
- a int.IOException
- if any error occurs reading the bytes.public void mark(int readLimit)
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 InputStream
reset()
,
InputStream.mark(int)
public boolean markSupported()
markSupported
in class InputStream
public int read() throws IOException
read
in class AbstractInputStreamWrapper
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 OutputStream
until the position
where reset
was issued is reached again. This ensures the
data copied to the destination OutputStream
reflects the
data contained in the source InputStream (the one passed in the
constructor).
reset
in class InputStream
IOException
- If the source stream has an exception in calling
reset().mark(int)
,
InputStream.reset()
Copyright © 2008–2016. All rights reserved.