alloc_io)Expand description
Traits, helpers, and type definitions for core I/O functionality.
The io module contains a number of common things you’ll need
when doing input and output. The most core part of this module is
the Read and Write traits, which provide the
most general interface for reading and writing input and output.
§Read and Write
Because they are traits, Read and Write are implemented by a number
of other types, and you can implement them for your types too. As such,
you’ll see a few different types of I/O throughout the documentation in
this module: Files, TcpStreams, and sometimes even Vec<T>s. For
example, Read adds a read method, which we can use on
Files:
use std::io;
use std::io::prelude::*;
use std::fs::File;
fn main() -> io::Result<()> {
let mut f = File::open("foo.txt")?;
let mut buffer = [0; 10];
// read up to 10 bytes
let n = f.read(&mut buffer)?;
println!("The bytes: {:?}", &buffer[..n]);
Ok(())
}Read and Write are so important, implementors of the two traits have a
nickname: readers and writers. So you’ll sometimes see ‘a reader’ instead
of ‘a type that implements the Read trait’. Much easier!
§Seek and BufRead
Beyond that, there are two important traits that are provided: Seek
and BufRead. Both of these build on top of a reader to control
how the reading happens. Seek lets you control where the next byte is
coming from:
use std::io;
use std::io::prelude::*;
use std::io::SeekFrom;
use std::fs::File;
fn main() -> io::Result<()> {
let mut f = File::open("foo.txt")?;
let mut buffer = [0; 10];
// skip to the last 10 bytes of the file
f.seek(SeekFrom::End(-10))?;
// read up to 10 bytes
let n = f.read(&mut buffer)?;
println!("The bytes: {:?}", &buffer[..n]);
Ok(())
}BufRead uses an internal buffer to provide a number of other ways to read, but
to show it off, we’ll need to talk about buffers in general. Keep reading!
§BufReader and BufWriter
Byte-based interfaces are unwieldy and can be inefficient, as we’d need to be
making near-constant calls to the operating system. To help with this,
std::io comes with two structs, BufReader and BufWriter, which wrap
readers and writers. The wrapper uses a buffer, reducing the number of
calls and providing nicer methods for accessing exactly what you want.
For example, BufReader works with the BufRead trait to add extra
methods to any reader:
use std::io;
use std::io::prelude::*;
use std::io::BufReader;
use std::fs::File;
fn main() -> io::Result<()> {
let f = File::open("foo.txt")?;
let mut reader = BufReader::new(f);
let mut buffer = String::new();
// read a line into buffer
reader.read_line(&mut buffer)?;
println!("{buffer}");
Ok(())
}BufWriter doesn’t add any new ways of writing; it just buffers every call
to write:
use std::io;
use std::io::prelude::*;
use std::io::BufWriter;
use std::fs::File;
fn main() -> io::Result<()> {
let f = File::create("foo.txt")?;
{
let mut writer = BufWriter::new(f);
// write a byte to the buffer
writer.write(&[42])?;
} // the buffer is flushed once writer goes out of scope
Ok(())
}§Iterator types
A large number of the structures provided by std::io are for various
ways of iterating over I/O. For example, Lines is used to split over
lines:
use std::io;
use std::io::prelude::*;
use std::io::BufReader;
use std::fs::File;
fn main() -> io::Result<()> {
let f = File::open("foo.txt")?;
let reader = BufReader::new(f);
for line in reader.lines() {
println!("{}", line?);
}
Ok(())
}§io::Result
Last, but certainly not least, is io::Result. This type is used
as the return type of many std::io functions that can cause an error, and
can be returned from your own functions as well. Many of the examples in this
module use the ? operator:
use std::io;
fn read_input() -> io::Result<()> {
let mut input = String::new();
io::stdin().read_line(&mut input)?;
println!("You typed: {}", input.trim());
Ok(())
}The return type of read_input(), io::Result<()>, is a very
common type for functions which don’t have a ‘real’ return value, but do want to
return errors if they happen. In this case, the only purpose of this function is
to read the line and print it, so we use ().
Modules§
- prelude
Experimental - The I/O Prelude.
Macros§
- const_
error Experimental - Creates a new I/O error from a known kind of error and a string literal.
Structs§
- Borrowed
Buf Experimental - A borrowed buffer of initially uninitialized elements, which is incrementally filled.
- Borrowed
Cursor Experimental - A writeable view of the unfilled portion of a
BorrowedBuf. - BufReader
Experimental - The
BufReader<R>struct adds buffering to any reader. - BufWriter
Experimental - Wraps a writer and buffers its output.
- Bytes
Experimental - An iterator over
u8values of a reader. - Chain
Experimental - Adapter to chain together two readers.
- Cursor
Experimental - A
Cursorwraps an in-memory buffer and provides it with aSeekimplementation. - Empty
Experimental Emptyignores any data written viaWrite, and will always be empty (returning zero bytes) when read viaRead.- Error
Experimental - The error type for I/O operations of the
Read,Write,Seek, and associated traits. - Into
Inner Error Experimental - An error returned by
BufWriter::into_innerwhich combines an error that happened while writing out the buffer, and the buffered writer object which may be used to recover from the condition. - IoSlice
Experimental - A buffer type used with
Write::write_vectored. - IoSlice
Mut Experimental - A buffer type used with
Read::read_vectored. - Line
Writer Experimental - Wraps a writer and buffers output to it, flushing whenever a newline
(
0x0a,'\n') is detected. - Lines
Experimental - An iterator over the lines of an instance of
BufRead. - Repeat
Experimental - A reader which yields one byte over and over and over and over and over and…
- Sink
Experimental - A writer which will move data into the void.
- Split
Experimental - An iterator over the contents of an instance of
BufReadsplit on a particular byte. - Take
Experimental - Reader adapter which limits the bytes read from an underlying reader.
- Writer
Panicked Experimental - Error returned for the buffered data from
BufWriter::into_parts, when the underlying writer has previously panicked. Contains the (possibly partly written) buffered data.
Enums§
- Error
Kind Experimental - A list specifying general categories of I/O error.
- Seek
From Experimental - Enumeration of possible methods to seek within an I/O object.
Traits§
- BufRead
Experimental - A
BufReadis a type ofReader which has an internal buffer, allowing it to perform extra ways of reading. - Read
Experimental - The
Readtrait allows for reading bytes from a source. - Seek
Experimental - The
Seektrait provides a cursor which can be moved within a stream of bytes. - Write
Experimental - A trait for objects which are byte-oriented sinks.
Functions§
- copy
Experimental - Copies the entire contents of a reader into a writer.
- empty
Experimental - Creates a value that is always at EOF for reads, and ignores all data written.
- read_
to_ string Experimental - Reads all bytes from a reader into a new
String. - repeat
Experimental - Creates an instance of a reader that infinitely repeats one byte.
- sink
Experimental - Creates an instance of a writer which will successfully consume all data.
Type Aliases§
- RawOs
Error Experimental - The type of raw OS error codes.
- Result
Experimental - A specialized
Resulttype for I/O operations.