Question

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.

Était-ce utile?

La solution

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.

Autres conseils

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

You can do a check over the type and decide otherwise for an exception ...

if !(in instanceof Seekable) { throw new IllegalArgumentException("not an instance of Seekable");

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top