The byteOffset parameter is now optional. If you omit it, it will read right after the latest read offset, just like you're operating on data stream not blob. You can still interact with the internal pointer with those functions:
Moves the internal pointer to the position
Returns the current position
Skips given count of bytes
slice(start, end, forceCopy = false)
Returns view (jDataView) on part of original one; may point to the same memory buffer or copy data into new one depending on forceCopy parameter.