_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