com.gc.iotools.stream.is
Class TeeInputStreamOutputStream

java.lang.Object
  extended by java.io.InputStream
      extended by com.gc.iotools.stream.base.AbstractInputStreamWrapper
          extended by com.gc.iotools.stream.is.TeeInputStreamOutputStream
All Implemented Interfaces:
Closeable

public class TeeInputStreamOutputStream
extends AbstractInputStreamWrapper

Copies the data from the underlying InputStream to the OutputStream passed in the constructor. The data copied are similar to the underlying InputStream.

When the method AbstractInputStreamWrapper.close() is invoked all the bytes remaining in the underlying InputStream are copied to the OutputStream. This behavior is different from this class and TeeInputStream in Apache commons-io.

Bytes skipped are copied to the OutputStream.

Sample usage:

         InputStream source=... //some data to be readed.
   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.
   byte[] bytes=destination1.getBytes();
 

Since:
1.0.6
Author:
dvd.smnt
See Also:
TeeInputStream

Field Summary
protected  boolean closeStreams
          If true source and destination streams are closed when AbstractInputStreamWrapper.close() is invoked.
protected  OutputStream destination
          The destination OutputStream where data is written.
 
Fields inherited from class com.gc.iotools.stream.base.AbstractInputStreamWrapper
closeCalled, source
 
Constructor Summary
TeeInputStreamOutputStream(InputStream source, OutputStream destination)
           Creates a TeeInputStreamOutputStream and saves its argument, the input stream source and the OutputStream destination for later use.
TeeInputStreamOutputStream(InputStream source, OutputStream destination, boolean closeStreams)
          Creates a TeeInputStreamOutputStream and saves its argument, the input stream source and the output stream destination for later use.
 
Method Summary
 int available()
          
 void closeOnce()
           This method is called when the method AbstractInputStreamWrapper.close() is invoked.
 int innerRead(byte[] b, int off, int len)
           
 void mark(int readLimit)
           Marks the current position in this input stream.
 boolean markSupported()
          
 int read()
          
 void reset()
           Repositions this stream to the position at the time the mark method was last called on this input stream.
 
Methods inherited from class com.gc.iotools.stream.base.AbstractInputStreamWrapper
close, read, skip
 
Methods inherited from class java.io.InputStream
read
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

destination

protected final OutputStream destination
The destination OutputStream where data is written.


closeStreams

protected final boolean closeStreams
If true source and destination streams are closed when AbstractInputStreamWrapper.close() is invoked.

Constructor Detail

TeeInputStreamOutputStream

public TeeInputStreamOutputStream(InputStream source,
                                  OutputStream destination)

Creates a TeeInputStreamOutputStream 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.

Parameters:
source - The underlying InputStream
destination - Data read from source are also written to this OutputStream.

TeeInputStreamOutputStream

public TeeInputStreamOutputStream(InputStream source,
                                  OutputStream destination,
                                  boolean closeStreams)
Creates a TeeInputStreamOutputStream and saves its argument, the input stream source and the output stream destination for later use.

Parameters:
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).
Since:
1.2.0
Method Detail

available

public int available()
              throws IOException

Overrides:
available in class InputStream
Throws:
IOException

closeOnce

public void closeOnce()
               throws IOException

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. When the class was constructed with the parameter closeStreams set to false the underlying streams must be closed externally.

Specified by:
closeOnce in class AbstractInputStreamWrapper
Throws:
IOException - thrown when a IO problem occurs in reading or writing the data.
See Also:
AbstractInputStreamWrapper.close()

innerRead

public int innerRead(byte[] b,
                     int off,
                     int len)
              throws IOException
Specified by:
innerRead in class AbstractInputStreamWrapper
Throws:
IOException

mark

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.

Overrides:
mark in class InputStream
Parameters:
readLimit - the maximum limit of bytes that can be read before the mark position becomes invalid.
Since:
1.2.0
See Also:
reset(), InputStream.mark(int)

markSupported

public boolean markSupported()

Overrides:
markSupported in class InputStream

read

public int read()
         throws IOException

Overrides:
read in class AbstractInputStreamWrapper
Throws:
IOException

reset

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).

Overrides:
reset in class InputStream
Throws:
IOException - If the source stream has an exception in calling reset().
Since:
1.2.0
See Also:
mark(int), InputStream.reset()


Copyright © 2008-2009. All Rights Reserved.