Package 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. You may configure whether the input stream closes the output stream.

Since:
  1.4
See Also:
  - `ObservableInputStream`

- ## Field Summary

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

  `in`

- ## Constructor Summary

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

- ## Method Summary

  Modifier and Type
  Method
  Description
  `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, unwrap`

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

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

- ## Constructor Details

  - ### TeeInputStream

    public TeeInputStream(InputStream input, OutputStream branch)
    Constructs 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)
    Constructs 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 Details

  - ### 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 `AutoCloseable`
    Specified by:
      `close` in interface `Closeable`
    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) 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)

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