java.lang.Object
java.io.InputStream
org.refcodes.io.SkipAvailableInputStream
- All Implemented Interfaces:
Closeable
,AutoCloseable
,Skippable
,org.refcodes.mixin.ReadTimeoutMillisAccessor
public class SkipAvailableInputStream
extends InputStream
implements org.refcodes.mixin.ReadTimeoutMillisAccessor, Skippable
The
SkipAvailableInputStream
decorates an InputStream
with
skip timed functionality, e.g. skip all currently available bytes
(Skippable.skipAvailable()
), all bytes available for a period of time
(skipAvailableWithin(long)
) or skip all bytes available till a send
pause of a given time is detected (skipAvailableTillSilenceFor(long)
or Skippable.skipAvailableTillSilenceFor(long, long)
). Ehttps://www.metacodes.proly the latter
two methods are useful when a send pause is used by some kind of handshake
mechanism. ATTENTION: This implementation relies upon the
available()
method to return some useful information!-
Nested Class Summary
Nested classes/interfaces inherited from interface org.refcodes.mixin.ReadTimeoutMillisAccessor
org.refcodes.mixin.ReadTimeoutMillisAccessor.ReadTimeoutMillisBuilder<B extends org.refcodes.mixin.ReadTimeoutMillisAccessor.ReadTimeoutMillisBuilder<B>>, org.refcodes.mixin.ReadTimeoutMillisAccessor.ReadTimeoutMillisMutator, org.refcodes.mixin.ReadTimeoutMillisAccessor.ReadTimeoutMillisProperty
-
Constructor Summary
ConstructorDescriptionSkipAvailableInputStream
(InputStream aInputStream) Constructs aSkipAvailableInputStream
decorating anInputStream
with additional timeout functionality.SkipAvailableInputStream
(InputStream aInputStream, long aTimeoutMillis) Constructs aSkipAvailableInputStream
decorating anInputStream
with additional timeout functionality. -
Method Summary
Modifier and TypeMethodDescriptionint
Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking, which may be 0, or 0 when end of stream is detected.void
close()
long
void
mark
(int readlimit) boolean
int
read()
int
read
(byte[] aB) int
read
(byte[] aB, int aOff, int aLen) byte[]
int
readNBytes
(byte[] b, int off, int len) byte[]
readNBytes
(int aArg0) void
reset()
long
skip
(long n) Skips over and discardsn
bytes of data from this input stream.void
skipAvailableTillSilenceFor
(long aSilenceTimeSpanInMs) Skips all available bytes till a given time span of silence is detected: The number of bytes available must be 0 for the given time span for this operation to conclude.void
skipAvailableWithin
(long aSkipTimeSpanInMs) Skips all available bytes till after the given time no more bytes are available, else skipping is repeated till no more bytes are available within the given time span.This method blocks until the according available bytes have been skipped.toString()
long
transferTo
(OutputStream aOut) Methods inherited from class java.io.InputStream
nullInputStream, skipNBytes
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface org.refcodes.io.Skippable
skipAvailable, skipAvailableExcept, skipAvailableTill, skipAvailableTillSilenceFor, skipAvailableWithin, skipAvailableWithin
-
Constructor Details
-
SkipAvailableInputStream
Constructs aSkipAvailableInputStream
decorating anInputStream
with additional timeout functionality.- Parameters:
aInputStream
- TheInputStream
to be decorated.
-
SkipAvailableInputStream
Constructs aSkipAvailableInputStream
decorating anInputStream
with additional timeout functionality.- Parameters:
aInputStream
- TheInputStream
to be decorated.aTimeoutMillis
- The default timeout for read operations not explicitly called with a timeout argument. With a value of -1 timeout handling is disabled (blocking mode).
-
-
Method Details
-
skipAvailableTillSilenceFor
public void skipAvailableTillSilenceFor(long aSilenceTimeSpanInMs) throws IOException, org.refcodes.exception.TimeoutIOException Skips all available bytes till a given time span of silence is detected: The number of bytes available must be 0 for the given time span for this operation to conclude. This method blocks until the time span of silence has been reached. ATTENTION: To apply a custom timeout, please useSkippable.skipAvailableTillSilenceFor(long, long)
. In case the read timeout as ofgetReadTimeoutMillis()
) is not -1 and the overall time while skipping bytes exceeds the read timeout aTimeoutIOException
is thrown. ATTENTION: To apply a custom timeout, please useSkippable.skipAvailableTillSilenceFor(long, long)
.- Specified by:
skipAvailableTillSilenceFor
in interfaceSkippable
- Parameters:
aSilenceTimeSpanInMs
- The time span in milliseconds of silence (0 bytes available) till skipping is terminated.- Throws:
org.refcodes.exception.TimeoutIOException
- in case the the read timeout is not -1 as ofgetReadTimeoutMillis()
and the overall time while skipping bytes exceeds the read timeout .IOException
- thrown in case of I/O issues.
-
skipAvailableWithin
Skips all available bytes till after the given time no more bytes are available, else skipping is repeated till no more bytes are available within the given time span.This method blocks until the according available bytes have been skipped. ATTENTION: To apply a custom timeout, please useSkippable.skipAvailableWithin(long, long)
. In case the read timeout as ofgetReadTimeoutMillis()
) is not -1 and the overall time while skipping bytes exceeds the read timeout aTimeoutIOException
is thrown. ATTENTION: To apply a custom timeout, please useSkippable.skipAvailableWithin(long, long)
.- Specified by:
skipAvailableWithin
in interfaceSkippable
- Parameters:
aSkipTimeSpanInMs
- the skip time span in ms- Throws:
org.refcodes.exception.TimeoutIOException
- in case the the read timeout is not -1 as ofgetReadTimeoutMillis()
and the overall time while skipping bytes exceeds the read timeout .IOException
- thrown in case of I/O issues.
-
available
Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking, which may be 0, or 0 when end of stream is detected. The read might be on the same thread or another thread. A single read or skip of this many bytes will not block, but may read or skip fewer bytes. Note that while some implementations as of theInputStream
will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream. A subclass's implementation of this method may choose to throw anIOException
if this input stream has been closed. Theavailable
method ofInputStream
always returns0
.- Specified by:
available
in interfaceSkippable
- Overrides:
available
in classInputStream
- Returns:
- an estimate of the number of bytes that can be read (or skipped
over) from this input stream without blocking or
0
when it reaches the end of the input stream. - Throws:
IOException
- if an I/O error occurs.
-
read
- Specified by:
read
in classInputStream
- Throws:
IOException
-
read
- Overrides:
read
in classInputStream
- Throws:
IOException
-
read
- Overrides:
read
in classInputStream
- Throws:
IOException
-
readAllBytes
- Overrides:
readAllBytes
in classInputStream
- Throws:
IOException
-
readNBytes
- Overrides:
readNBytes
in classInputStream
- Throws:
IOException
-
readNBytes
- Overrides:
readNBytes
in classInputStream
- Throws:
IOException
-
toString
-
transferTo
- Overrides:
transferTo
in classInputStream
- Throws:
IOException
-
close
- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceCloseable
- Overrides:
close
in classInputStream
- Throws:
IOException
-
mark
public void mark(int readlimit) - Overrides:
mark
in classInputStream
-
markSupported
public boolean markSupported()- Overrides:
markSupported
in classInputStream
-
reset
- Overrides:
reset
in classInputStream
- Throws:
IOException
-
skip
Skips over and discardsn
bytes of data from this input stream. Theskip
method may, for a variety of reasons, end up skipping over some smaller number of bytes, possibly0
. This may result from any of a number of conditions; reaching end of file beforen
bytes have been skipped is only one possibility. The actual number of bytes skipped is returned. Ifn
is negative, theskip
method for classInputStream
always returns 0, and no bytes are skipped. Subclasses may handle the negative value differently. Theskip
method implementation of this class creates a byte array and then repeatedly reads into it untiln
bytes have been read or the end of the stream has been reached. Subclasses are encouraged to provide a more efficient implementation of this method. For instance, the implementation may depend on the ability to seek.- Specified by:
skip
in interfaceSkippable
- Overrides:
skip
in classInputStream
- Parameters:
n
- the number of bytes to be skipped.- Returns:
- the actual number of bytes skipped which might be zero.
- Throws:
IOException
- if an I/O error occurs.
-
getReadTimeoutMillis
public long getReadTimeoutMillis()- Specified by:
getReadTimeoutMillis
in interfaceorg.refcodes.mixin.ReadTimeoutMillisAccessor
-