org.eclipse.ecf.provider.filetransfer.util
Class TimeoutInputStream

java.lang.Object
  extended by java.io.InputStream
      extended by java.io.FilterInputStream
          extended by org.eclipse.ecf.provider.filetransfer.util.TimeoutInputStream
All Implemented Interfaces:
java.io.Closeable

public class TimeoutInputStream
extends java.io.FilterInputStream

Wraps an input stream that blocks indefinitely to simulate timeouts on read(), skip(), and close(). The resulting input stream is buffered and supports retrying operations that failed due to an InterruptedIOException. Supports resuming partially completed operations after an InterruptedIOException REGARDLESS of whether the underlying stream does unless the underlying stream itself generates InterruptedIOExceptions in which case it must also support resuming. Check the bytesTransferred field to determine how much of the operation completed; conversely, at what point to resume.

Since:
3.0

Field Summary
 
Fields inherited from class java.io.FilterInputStream
in
 
Constructor Summary
TimeoutInputStream(java.io.InputStream in, int bufferSize, long readTimeout, long closeTimeout)
          Creates a timeout wrapper for an input stream.
TimeoutInputStream(java.io.InputStream in, int bufferSize, long readTimeout, long closeTimeout, boolean growWhenFull)
           
 
Method Summary
 int available()
          Returns the number of unread bytes in the buffer.
 void close()
          Wraps the underlying stream's method.
 boolean markSupported()
          Mark is not supported by the wrapper even if the underlying stream does, returns false.
 int read()
          Reads a byte from the stream.
 int read(byte[] buffer, int off, int len)
          Reads multiple bytes from the stream.
 long skip(long count)
          Skips multiple bytes in the stream.
 
Methods inherited from class java.io.FilterInputStream
mark, read, reset
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

TimeoutInputStream

public TimeoutInputStream(java.io.InputStream in,
                          int bufferSize,
                          long readTimeout,
                          long closeTimeout)
Creates a timeout wrapper for an input stream.

Parameters:
in - the underlying input stream
bufferSize - the buffer size in bytes; should be large enough to mitigate Thread synchronization and context switching overhead
readTimeout - the number of milliseconds to block for a read() or skip() before throwing an InterruptedIOException; 0 blocks indefinitely
closeTimeout - the number of milliseconds to block for a close() before throwing an InterruptedIOException; 0 blocks indefinitely, -1 closes the stream in the background

TimeoutInputStream

public TimeoutInputStream(java.io.InputStream in,
                          int bufferSize,
                          long readTimeout,
                          long closeTimeout,
                          boolean growWhenFull)
Method Detail

close

public void close()
           throws java.io.IOException
Wraps the underlying stream's method. It may be important to wait for a stream to actually be closed because it holds an implicit lock on a system resoure (such as a file) while it is open. Closing a stream may take time if the underlying stream is still servicing a previous request.

Specified by:
close in interface java.io.Closeable
Overrides:
close in class java.io.FilterInputStream
Throws:
java.io.InterruptedIOException - if the timeout expired
java.io.IOException - if an i/o error occurs

available

public int available()
              throws java.io.IOException
Returns the number of unread bytes in the buffer.

Overrides:
available in class java.io.FilterInputStream
Throws:
java.io.IOException - if an i/o error occurs

read

public int read()
         throws java.io.IOException
Reads a byte from the stream.

Overrides:
read in class java.io.FilterInputStream
Throws:
java.io.InterruptedIOException - if the timeout expired and no data was received, bytesTransferred will be zero
java.io.IOException - if an i/o error occurs

read

public int read(byte[] buffer,
                int off,
                int len)
         throws java.io.IOException
Reads multiple bytes from the stream.

Overrides:
read in class java.io.FilterInputStream
Throws:
java.io.InterruptedIOException - if the timeout expired and no data was received, bytesTransferred will be zero
java.io.IOException - if an i/o error occurs

skip

public long skip(long count)
          throws java.io.IOException
Skips multiple bytes in the stream.

Overrides:
skip in class java.io.FilterInputStream
Throws:
java.io.InterruptedIOException - if the timeout expired before all of the bytes specified have been skipped, bytesTransferred may be non-zero
java.io.IOException - if an i/o error occurs

markSupported

public boolean markSupported()
Mark is not supported by the wrapper even if the underlying stream does, returns false.

Overrides:
markSupported in class java.io.FilterInputStream