Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how do i know which filestream supports seek in Java

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.

like image 367
Rakesh Malik Avatar asked Jan 15 '14 11:01

Rakesh Malik


3 Answers

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.

like image 72
Kayaman Avatar answered Sep 20 '22 22:09

Kayaman


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)

like image 45
Evgeniy Dorofeev Avatar answered Sep 23 '22 22:09

Evgeniy Dorofeev


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

like image 27
Durandal Avatar answered Sep 20 '22 22:09

Durandal