Expand description
Traits and types for expressing I/O transfers of both byte-wise and block-wise granularity.
The important items are summarized below:
BlockReader,BlockWriter: traits that represent I/O streams which can be read from or written to at the granularity of a single block (as the smallest transferable chunk).BlockIo: a parent trait that specifies the size in bytes of each block in a block-based I/O stream.KnownLength: a trait that represents an I/O stream with a known length, such as a disk drive.ByteReader,ByteWriter: traits that represent I/O streams which can be read from or written to at the granularity of an individual byte.- Wrapper types that allow byte-wise access atop block-based I/O streams:
ByteReaderWrapper,ByteWriterWrapper,ByteReaderWriterWrapper.- Notably, the
blocks_from_bytes()function is useful for calculating the set of block-based I/O transfers that are needed to satisfy an arbitrary byte-wise transfer.
- Notably, the
For example, a storage device like a hard drive that supports transfers of 512-byte blocks
should implement BlockIo, BlockReader, BlockWriter, and KnownLength traits.
A user can then use those traits directly to transfer whole blocks to/from the device,
or wrap the storage device in one of the byte-wise reader/writer types
in order to transfer arbitrary bytes (as little as one byte) at a time to/from the device.
We also provide the LockableIo type for convenient use with I/O streams or devices
that exist behind a shared lock, e.g., Arc<Mutex<IO>>, Mutex<IO>, etc.
This allows you to access the I/O stream transparently through the lock by using traits
that the interior IO object implements, such as the block-wise I/O traits listed above.
Stateless vs. Stateful I/O
Note that the above traits represent “stateless” access into I/O streams or devices, in that successive read/write operations will not advance any kind of “offset” or cursor.
To read or write while tracking the current offset into the I/O stream,
we provide the ReaderWriter, Reader, and Writer structs,
which act as “stateful” wrappers around an underlying “stateless” I/O stream
(such as a stateless ByteReader or ByteWriter).
This offers a more convenient interface with more traditional I/O behavior,
in which the next read or write operation will start where the prior one ended.
Structs
- Describes an operation for performing byte-wise I/O on a block-based I/O stream.
- A wrapper struct that implements a byte-wise reader atop a block-based reader.
- A wrapper struct that implements a byte-wise reader and writer atop a block-based reader and writer.
- A wrapper struct that implements a byte-wise writer atop a block-based reader and writer.
- A struct that holds an IO object wrapped in a
LockabletypeL, for the purpose of forwarding various IO-related traits through the lock to theIOtype. - A stateful reader that keeps track of its current offset within the internal stateless
ByteReaderI/O stream. - A readable and writable “stateful” I/O stream that keeps track of its current offset within its internal stateless I/O stream.
- A stateful writer that keeps track of its current offset within the internal stateless
ByteWriterI/O stream.
Enums
- Errors that can be returned from I/O operations.
Traits
- A parent trait used to specify the block size (in bytes) of I/O transfers (read and write operations). See its use in
BlockReaderandBlockWriter. - 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
BlockIo::block_size()function. - A trait that represents an I/O stream (e.g., an I/O device) that can be written to in blocks. The block size specifies the minimum granularity of each transfer, as given by the
BlockIo::block_size()function. - A trait that represents an I/O stream that can be read from at the granularity of individual bytes, but which does not track the current offset into the stream.
- A trait that represents an I/O stream that can be written to, but which does not track the current offset into the stream.
- A trait that represents an I/O stream that has a known length, e.g., a disk drive.
Functions
- Calculates block-wise bounds for an I/O transfer based on a byte-wise range into a block-wise stream.