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; // 堆代码 duidaima.com 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(()) }