Just make this discussion clear:

It's possible to allow Unpacker to call any IO operations multiple times generically. To implement it, Unpacker requires underlaying input stream to have `getXxx()` and `advance()` methods separately. `getXxx()` doesn't advance position so that Unpacker can call it multiple times. Only when Unpacker got enough amount of data (for example, 1 + 2 + 600 bytes if the value is 600-byte raw string), Unpacker calls `advance()`. `Input` interface of msgpack-java v6 implements this interface: https://github.com/msgpack/msgpack-java/blob/d31e5d54083cfd49e6e35c143171b4cf7b171d86/src/main/java/org/msgpack/io/Input.java#L30
However, underlaying input stream (MessageBufferInput) becomes complicated with this design because underlaying input stream does not know how much data should be buffered (note: underlaying input stream needs to buffer the data so that `getXxx` returns the same data multiple times) (Unpacker knows the length, though). For example, `LinkedBufferedInput` (https://github.com/msgpack/msgpack-java/blob/d31e5d54083cfd49e6e35c143171b4cf7b171d86/src/main/java/org/msgpack/io/LinkedBufferInput.java) has list of buffers to allow Unpacker to read arbitrary length raw string multiple times.

My idea is to put a limitation that Unpacker can call only certain IO methods multiple times. The methods are `getHeadByte` and `getLength{8,16,32}`. Even under this limitation, Unpacker can allow users to call most of unpackXxx multiple times. Unpacker only needs 8-byte extra buffer to copy partial data. Only problem is unpackRawString (or unpackString). In case of unpackRawString (or unpackString), Unpacker needs to allocate a new buffer for the raw value in addition to the 8-byte extra buffer.