org.apache.commons.io.input

## Class TeeInputStream

- java.lang.Object
- - java.io.InputStream
  - - java.io.FilterInputStream
    - - org.apache.commons.io.input.ProxyInputStream
      - - org.apache.commons.io.input.TeeInputStream

All Implemented Interfaces:
  Closeable, AutoCloseable

    public class TeeInputStream
    extends ProxyInputStream

InputStream proxy that transparently writes a copy of all bytes read from the proxied stream to a given OutputStream. Using `ProxyInputStream.skip(long)` or `ProxyInputStream.mark(int)`/`ProxyInputStream.reset()` on the stream will result on some bytes from the input stream being skipped or duplicated in the output stream.

The proxied input stream is closed when the `close()` method is called on this proxy. It is configurable whether the associated output stream will also closed.

Since:
  1.4
See Also:
  `ObservableInputStream`

### Field Summary

### Fields inherited from class java.io.FilterInputStream

`in`

### Constructor Summary

Constructors
Constructor and Description
`TeeInputStream(InputStream input, OutputStream branch)` Creates a TeeInputStream that proxies the given `InputStream` and copies all read bytes to the given `OutputStream`.
`TeeInputStream(InputStream input, OutputStream branch, boolean closeBranch)` Creates a TeeInputStream that proxies the given `InputStream` and copies all read bytes to the given `OutputStream`.

### Method Summary

All Methods Instance Methods Concrete Methods
`void` `close()` Closes the proxied input stream and, if so configured, the associated output stream.
`int` `read()` Reads a single byte from the proxied input stream and writes it to the associated output stream.
`int` `read(byte[] bts)` Reads bytes from the proxied input stream and writes the read bytes to the associated output stream.
`int` `read(byte[] bts, int st, int end)` Reads bytes from the proxied input stream and writes the read bytes to the associated output stream.

### Methods inherited from class org.apache.commons.io.input.ProxyInputStream

`afterRead, available, beforeRead, handleIOException, mark, markSupported, reset, skip`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Constructor Detail

#### TeeInputStream

    public TeeInputStream(InputStream input,
                          OutputStream branch)

Creates a TeeInputStream that proxies the given `InputStream` and copies all read bytes to the given `OutputStream`. The given output stream will not be closed when this stream gets closed.

Parameters:
  `input` - input stream to be proxied
  `branch` - output stream that will receive a copy of all bytes read

#### TeeInputStream

    public TeeInputStream(InputStream input,
                          OutputStream branch,
                          boolean closeBranch)

Creates a TeeInputStream that proxies the given `InputStream` and copies all read bytes to the given `OutputStream`. The given output stream will be closed when this stream gets closed if the closeBranch parameter is `true`.

Parameters:
  `input` - input stream to be proxied
  `branch` - output stream that will receive a copy of all bytes read
  `closeBranch` - flag for closing also the output stream when this stream is closed

### Method Detail

#### close

    public void close()
               throws IOException

Closes the proxied input stream and, if so configured, the associated output stream. An exception thrown from one stream will not prevent closing of the other stream.

Specified by:
  `close` in interface `Closeable`
Specified by:
  `close` in interface `AutoCloseable`
Overrides:
  `close` in class `ProxyInputStream`
Throws:
  `IOException` - if either of the streams could not be closed

#### read

    public int read()
             throws IOException

Reads a single byte from the proxied input stream and writes it to the associated output stream.

Overrides:
  `read` in class `ProxyInputStream`
Returns:
  next byte from the stream, or -1 if the stream has ended
Throws:
  `IOException` - if the stream could not be read (or written)

#### read

    public int read(byte[] bts,
                    int st,
                    int end)
             throws IOException

Reads bytes from the proxied input stream and writes the read bytes to the associated output stream.

Overrides:
  `read` in class `ProxyInputStream`
Parameters:
  `bts` - byte buffer
  `st` - start offset within the buffer
  `end` - maximum number of bytes to read
Returns:
  number of bytes read, or -1 if the stream has ended
Throws:
  `IOException` - if the stream could not be read (or written)

#### read

    public int read(byte[] bts)
             throws IOException

Reads bytes from the proxied input stream and writes the read bytes to the associated output stream.

Overrides:
  `read` in class `ProxyInputStream`
Parameters:
  `bts` - byte buffer
Returns:
  number of bytes read, or -1 if the stream has ended
Throws:
  `IOException` - if the stream could not be read (or written)