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
OutputStreams. |
void |
enableCopy(boolean[] enable)
Allow to switch off the copy to the underlying
OutputStreams, 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, skipreadprotected 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 InputStreamcloseStreams - 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 InputStreamdestination - 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 InputStreamdestination - 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 InputStreamIOExceptionpublic 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 AbstractInputStreamWrapperIOException - if any error occurs reading the bytes.AbstractInputStreamWrapper.close()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 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 AbstractInputStreamWrapperb - 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 InputStreamreset(),
InputStream.mark(int)public boolean markSupported()
markSupported in class InputStreampublic int read()
throws IOException
read in class AbstractInputStreamWrapperIOExceptionpublic 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 InputStreamIOException - If the source stream has an exception in calling
reset().mark(int),
InputStream.reset()Copyright © 2008–2016. All rights reserved.