java.io.InputStream.skip() says "Throws: IOException - if the stream does not support seek, or if some other I/O error occurs."
how do i know which filestream supports seek?
when google i find Seekable, but i can see that simple FileInputStream, ByteArrayInputStream ... also supports skip(), i mean does not give IOException; they does not extend Seekable.
The only way to know for sure is to read the javadocs for any particular stream you're interested in. The inheritance hierarchy is quite bad there, but it's an old class.
Edit: I just read the javadoc, and while it seems that InputStream itself does implement it (with a naive read/discard implementation), it says
"Subclasses are encouraged to provide a more efficient implementation of this method. For instance, the implementation may depend on the ability to seek."
Now instead of throwing an IOException
if seeking isn't supported, subclasses could always use the default implementation. However, most likely due to backwards compatibility, this artifact of weird design has been left in.
You can move FileInputStream
position with FileInputStream.getChannel.position(long)
. Skip is for streams, it is different from positioning, you cannot go back with it, it's for random access devices (HDD)
InputStream is by definition not seekable. You can only skip forward, not backward in the stream (the only exception is rewinding the stream using reset(), works only on streams that support mark).
As for the skip() method, skipping is always possible, in fact the InputStream class already implements it generically by simply reading and discarding bytes. A particular InputStream subclass may implement it differently (more efficient for the specific type).
The throws comment "IOException - if the stream does not support seek, or if some other I/O error occurs." is misleading in that it implies that there may be streams that categorically do not allow to skip bytes (which makes no sense, as skipping is semantically the same as read+discard).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With