_file = File::open("foo.txt")?;
Ok(())
使用 create 和 open 函数获取的 File 实例是只读或者只写的,如果想要控制更多的读写选项,则需要使用 std::fs::OpenOptions。它是一个 Builder,create 和 open 函数的底层也是这个 Builder。
使用 std::fs::OpenOptions 时,首先调用 OpenOptions::new,然后通过链式调用来设置读写选项,最后调用 OpenOptions::open 打开指定的文件。
use std::fs::OpenOptions;
fn main() -> std::io::Result<()> {
let _file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open("foo.txt")?;
let _file = OpenOptions::new()
.append(true)
.open("foo.txt")?;
let _file = OpenOptions::new()
.write(true)
.truncate(true)
.open("foo.txt");
Ok(())
读取文件主要用的是 std::io::Read Trait 中的函数。比如:
read(&mut self, buf: &mut [u8]) -> Result<usize>
read_to_string(&mut self, buf: &mut String) -> Result<usize>
use std::fs::File;
use std::io;
use std::io::prelude::*;
fn main() -> io::Result<()> {
let mut f = File::open("foo.txt")?;
let mut buffer = [0; 10];
let n = f.read(&mut buffer[..])?;
println!("The bytes: {:?}", &buffer[..n]);
let n = f.read(&mut buffer[..])?;
println!("The bytes: {:?}", &buffer[..n]);
let mut f = File::open("foo.txt")?;
let mut buffer = String::new();
f.read_to_string(&mut buffer)?;
println!("The string: {}", buffer);
Ok(())
另外,File 类型还实现了 std::io::Seek Trait,Seek 主要提供了一个 seek 函数,可以控制文件读取和写入的起始位置。
seek(&mut self, pos: SeekFrom) -> Result<u64>
use std::fs::File;
use std::io;
use std::io::prelude::*;
use std::io::SeekFrom;
fn main() -> io::Result<()> {
let mut f = File::open("foo.txt")?;
f.seek(SeekFrom::Start(10))?;
let mut buffer = String::new();
f.read_to_string(&mut buffer)?;
println!("The string: {}", buffer);
Ok(())
除了可以设置文件读取的起点,还可以限制文件读取的长度。std::io::Read 提供了 take 函数来限制文件读取的长度。
take(self, limit: u64) -> Take<Self>
use std::fs::File;
use std::io;
use std::io::prelude::\*;
fn main() -> io::Result<()> {
let f = File::open("foo.txt")?;
let mut buffer = [0; 10];
let mut handle = f.take(5);
handle.read(&mut buffer)?;
println!("buffer: {:?}", buffer);
Ok(())
读取文件主要用的是 std::io::Write Trait 中的函数。比如:
fn write(&mut self, buf: &[u8]) -> Result<usize> -- 尝试将 Buf 中的全部内容写入文件,有可能不成功。
fn flush(&mut self) -> Result<()>
fn write_all(&mut self, buf: &[u8]) -> Result<()> -- 持续调用 write,将 Buf 中的所有内容都写入文件。
use std::fs::File;
use std::io::prelude::*;
fn main() -> std::io::Result<()> {
let mut buffer = File::create("foo.txt")?;
buffer.write(b"some bytes")?;
buffer.write_all(b"more bytes")?;
buffer.flush()?;
Ok(())
The Rust Standard Library
Rust By Example
RustPrimer