Review for 7157656 (zipfs) SeekableByteChannel to entry in zip file...
Alan Bateman
Alan.Bateman at oracle.com
Wed Apr 18 08:32:25 UTC 2012
On 17/04/2012 22:23, Xueming Shen wrote:
>
> Given the sequential nature of the zip stream, it's a kinda of hard to
> implement the
> position(long) method for a "pure" zip byte channel. You don't want to
> jump either
> backward or forward N bytes when writing and appending (we don't have
> a "position
> mapping" between the compressed and uncompressed data, so you simply
> can't
> "position" to a desired N pos when compressing), and for the same
> reason you don't
> want to jump back either when reading, the only "meaningful/doable"
> position(N)
> operation is when N> position() for reading, which is basically a
> "skip N - position()
> byte" operation.
>
> In order to implement the position(N), for writing, you have to write
> all the data
> without compression into a "buffer", you then can "position(N)" on it.
> And only do the
> real compression upon closing. For reading, you have to de-compress
> the whole zip
> entry into a buffer first, then build a channel on top of this buffer
> for the reading/
> positioning. This is how newFileChannel is implemented now.
>
> -Sherman
Right, a SeekableByteChannel allows for random access but you don't know
in advance how the channel will actually be used, it may only be used
for sequential access. Given that the zip provider supports FileChannel
then maybe it could be implemented so that it switches (behind the
scenes) to a FileChannel when position is invoked to seek to a
position<current. For the read (or read+write) case then
position>current can just skip as you suggest, the write-only case would
have to switch to a FileChannel. It will likely to be tricky of course.
BTW: This the comment was just a passing comment when looking at Paul's
patch, it's of course a several issue/project that should preclude
Paul's fix from going in.
-Alan
More information about the core-libs-dev
mailing list