The NIO2 API's SeekableInMemoryByteChannel currently returns 0 when a read requests data either at the end of the data or past the end of the data.
The API for SeekableByteChannel ( http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SeekableByteChannel.html#read(java.nio.ByteBuffer) ) states the return value should be -1 if EOF has been reached. This behavior is confirmed through testing of FileChannelImpl.
Java's sun.nio.cs.StreamDecoder.readBytes() expects this behavior, throwing an IOException if zero bytes are read.
I encountered this issue using GSON to write and then read a json file from a ShrinkWrap archive as part of a unit test. At the end of reading a json file, GSON checks that the EOF has been reached, and at this point a read returns 0 and causes an exception in sun.nio.cs.StreamDecoder.readBytes().
A unit test showing the issue: