ไม่มีฟังก์ชั่นใดที่ฉันแสดงที่นี่ให้ตื่นตระหนกด้วยตัวเอง แต่ฉันกำลังใช้expect
เพราะฉันไม่รู้ว่าการจัดการข้อผิดพลาดแบบใดจะเหมาะกับแอปพลิเคชันของคุณมากที่สุด ไปอ่านสนิมโปรแกรมภาษาของบทที่เกี่ยวกับการจัดการข้อผิดพลาดจะเข้าใจวิธีการที่เหมาะสมจัดการกับความล้มเหลวในโปรแกรมของคุณเอง
สนิม 1.26 ขึ้นไป
หากคุณไม่ต้องการใส่ใจรายละเอียดพื้นฐานมีฟังก์ชันบรรทัดเดียวสำหรับอ่านและเขียน
อ่านไฟล์เป็นไฟล์ String
use std::fs;
fn main() {
let data = fs::read_to_string("/etc/hosts").expect("Unable to read file");
println!("{}", data);
}
อ่านไฟล์เป็นไฟล์ Vec<u8>
use std::fs;
fn main() {
let data = fs::read("/etc/hosts").expect("Unable to read file");
println!("{}", data.len());
}
เขียนไฟล์
use std::fs;
fn main() {
let data = "Some data!";
fs::write("/tmp/foo", data).expect("Unable to write file");
}
Rust 1.0 ขึ้นไป
แบบฟอร์มเหล่านี้มีรายละเอียดมากกว่าฟังก์ชันบรรทัดเดียวที่จัดสรรString
หรือVec
ให้คุณเล็กน้อย แต่มีประสิทธิภาพมากกว่าที่คุณสามารถใช้ข้อมูลที่จัดสรรซ้ำหรือผนวกเข้ากับอ็อบเจ็กต์ที่มีอยู่ได้
การอ่านข้อมูล
การอ่านไฟล์ต้องใช้สองส่วนหลัก: File
และRead
.
อ่านไฟล์เป็นไฟล์ String
use std::fs::File;
use std::io::Read;
fn main() {
let mut data = String::new();
let mut f = File::open("/etc/hosts").expect("Unable to open file");
f.read_to_string(&mut data).expect("Unable to read string");
println!("{}", data);
}
อ่านไฟล์เป็นไฟล์ Vec<u8>
use std::fs::File;
use std::io::Read;
fn main() {
let mut data = Vec::new();
let mut f = File::open("/etc/hosts").expect("Unable to open file");
f.read_to_end(&mut data).expect("Unable to read data");
println!("{}", data.len());
}
เขียนไฟล์
การเขียนไฟล์จะคล้ายกันยกเว้นว่าเราใช้Write
ลักษณะและเขียนเป็นไบต์เสมอ คุณสามารถแปลง a String
/ &str
เป็นไบต์ด้วยas_bytes
:
use std::fs::File;
use std::io::Write;
fn main() {
let data = "Some data!";
let mut f = File::create("/tmp/foo").expect("Unable to create file");
f.write_all(data.as_bytes()).expect("Unable to write data");
}
บัฟเฟอร์ I / O
ฉันรู้สึกถึงแรงผลักดันจากชุมชนให้ใช้BufReader
และBufWriter
แทนที่จะอ่านจากไฟล์โดยตรง
ตัวอ่านบัฟเฟอร์ (หรือตัวเขียน) ใช้บัฟเฟอร์เพื่อลดจำนวนคำขอ I / O ตัวอย่างเช่นการเข้าถึงดิสก์หนึ่งครั้งมีประสิทธิภาพมากขึ้นเพื่ออ่าน 256 ไบต์แทนที่จะเข้าถึงดิสก์ 256 ครั้ง
ดังที่กล่าวมาฉันไม่เชื่อว่าเครื่องอ่าน / นักเขียนบัฟเฟอร์จะมีประโยชน์เมื่ออ่านทั้งไฟล์ read_to_end
ดูเหมือนว่าจะคัดลอกข้อมูลในส่วนที่ค่อนข้างใหญ่ดังนั้นการถ่ายโอนอาจรวมกันเป็นคำขอ I / O น้อยลง
นี่คือตัวอย่างการใช้สำหรับการอ่าน:
use std::fs::File;
use std::io::{BufReader, Read};
fn main() {
let mut data = String::new();
let f = File::open("/etc/hosts").expect("Unable to open file");
let mut br = BufReader::new(f);
br.read_to_string(&mut data).expect("Unable to read string");
println!("{}", data);
}
และสำหรับการเขียน:
use std::fs::File;
use std::io::{BufWriter, Write};
fn main() {
let data = "Some data!";
let f = File::create("/tmp/foo").expect("Unable to create file");
let mut f = BufWriter::new(f);
f.write_all(data.as_bytes()).expect("Unable to write data");
}
A BufReader
มีประโยชน์มากกว่าเมื่อคุณต้องการอ่านทีละบรรทัด:
use std::fs::File;
use std::io::{BufRead, BufReader};
fn main() {
let f = File::open("/etc/hosts").expect("Unable to open file");
let f = BufReader::new(f);
for line in f.lines() {
let line = line.expect("Unable to read line");
println!("Line: {}", line);
}
}