闽公网安备 35020302035485号
use std::fs;
fn read_file_content_as_string(path: &str) -> Result<String, Box<dyn std::error::Error>> {
let string_content = fs::read_to_string(path)?;
Ok(string_content)
}
二,将整个文件读入到字节向量use std::fs;
fn read_file_as_bytes(path: &str) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
let byte_content = fs::read(path)?;
Ok(byte_content)
}
如果将字节向量转换为String,可以这样做:use std::fs;
use std::str;
fn read_file_as_bytes(path: &str) -> Result<String, Box<dyn std::error::Error>> {
let byte_content = fs::read(path)?;
let string_content = str::from_utf8(&byte_content)?;
Ok(string_content.to_string())
}
三,逐行读取文件如上所述,如果处理大文件,一次读取整个文件可能会导致问题。在这种情况下,最好使用逐行方法处理这些文件。当然,这主要适用于具有String内容的文件。Rust在其标准库中有一个方便的结构体,它去掉了一些较低级别的细节,称为BufReader。
这种方法可以处理以下特点的文件:
1.包含字符串内容的文件use std::fs::File;
use std::io::{BufReader, BufRead};
fn read_file_line_by_line(path: &str) -> Result<(), Box<dyn std::error::Error>> {
let file = File::open(path)?;
let reader = BufReader::new(file);
for line in reader.lines() {
match line {
// line是字符串
Ok(line) => process_line(line),
Err(err) => handle_error(err),
}
}
Ok(())
}
四,以单个字节逐步读取文件use std::fs::File;
use std::io::{BufReader, Read};
fn read_file_as_single_bytes(path: &str) -> Result<(), Box<dyn std::error::Error>> {
let file = File::open(path)?;
let reader = BufReader::new(file);
for byte in reader.bytes() {
match byte {
// byte正好是一个字节
Ok(byte) => process_byte(byte),
Err(err) => handle_error(err),
}
}
Ok(())
}
五,以字节块读取文件use std::fs::File;
use std::io::{BufReader, BufRead}
const BUFFER_SIZE: usize = 512;
fn read_file_in_byte_chunks(path: &str) -> Result<(), Box<dyn std::error::Error>> {
let file = File::open(path)?;
let mut reader = BufReader::with_capacity(BUFFER_SIZE, file);
loop {
let buffer = reader.fill_buf()?;
let buffer_length = buffer.len();
if buffer_length == 0 {
break;
}
do_something_with(buffer);
// 冲缓冲区中消耗所有字节
reader.consume(buffer_length);
}
Ok(())
}
总结