Is it necessary to wrap for each loop iteration?
Just reading the javadoc of ReadableByteChannel.read:

 Suppose that a byte sequence of length n is read ...
 ... Upon return the buffer's position will be equal to p + n; its limit will not have changed.