Ok I got it. After having understood that the real use of a ByteBuffer is interacting with a FileChannel (or with a IO/Channel in general). After having read the channel into the buffer the method flip() restore the position to zero and set the limit to the latest position occupied. In that way the buffer will be ready to be read itself. While rewind() just set the position to zero for rereading after having already been read.