A trait that represents an I/O stream (e.g., an I/O device) that can be read from in blocks.
The block size specifies the minimum granularity of each transfer,
as given by the
BlockReader is not aware of the current block offset into the stream;
thus, each read operation requires a starting offset:
the number of blocks from the beginning of the I/O stream at which the read should start.
Reads blocks of data from this reader into the given
The number of blocks read is dictated by the length of the given
buffer: the buffer into which data will be read. The length of this buffer must be a multiple of the block size.
block_offset: the offset in number of blocks from the beginning of this reader.
If successful, returns the number of blocks read into the given
Otherwise, returns an error.