Żadna z funkcji, które tu pokazuję, sama nie panikuje, ale używam, expect
ponieważ nie wiem, jaki rodzaj obsługi błędów najlepiej pasuje do Twojej aplikacji. Go przeczytać rdza język programowania jest rozdział dotyczący obsługi błędów , aby zrozumieć, jak prawidłowo obsługiwać awarię w swoim własnym programie.
Rust 1.26 i nowsze
Jeśli nie chcesz przejmować się podstawowymi szczegółami, dostępne są jednowierszowe funkcje do czytania i pisania.
Przeczytaj plik do pliku String
use std::fs;
fn main() {
let data = fs::read_to_string("/etc/hosts").expect("Unable to read file");
println!("{}", data);
}
Przeczytaj plik jako plik Vec<u8>
use std::fs;
fn main() {
let data = fs::read("/etc/hosts").expect("Unable to read file");
println!("{}", data.len());
}
Napisz plik
use std::fs;
fn main() {
let data = "Some data!";
fs::write("/tmp/foo", data).expect("Unable to write file");
}
Rust 1.0 i nowsze
Formularze te są nieco bardziej szczegółowe niż funkcje jednowierszowe, które przydzielają String
lub Vec
dla Ciebie, ale mają większe możliwości, ponieważ można ponownie wykorzystać przydzielone dane lub dołączyć je do istniejącego obiektu.
Czytanie danych
Odczyt pliku wymaga dwóch podstawowych elementów: File
i Read
.
Przeczytaj plik do pliku 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);
}
Przeczytaj plik jako plik 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());
}
Napisz plik
Pisanie pliku jest podobne, z tym że używamy Write
cechy i zawsze wypisujemy bajty. Możesz przekonwertować String
/ &str
na bajty za pomocą 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");
}
Buforowane we / wy
Poczułem, że społeczność zachęciła mnie do korzystania BufReader
i BufWriter
zamiast czytania bezpośrednio z pliku
Buforowany czytnik (lub program zapisujący) używa bufora w celu zmniejszenia liczby żądań we / wy. Na przykład o wiele bardziej efektywne jest jednorazowe uzyskanie dostępu do dysku w celu odczytania 256 bajtów zamiast dostępu do dysku 256 razy.
Biorąc to pod uwagę, nie sądzę, aby buforowany czytnik / pisarz był przydatny podczas czytania całego pliku. read_to_end
wydaje się, że kopiuje dane w dość dużych porcjach, więc transfer może być już naturalnie połączony w mniejszą liczbę żądań we / wy.
Oto przykład użycia go do czytania:
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);
}
A do pisania:
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
jest bardziej przydatny, gdy chcesz czytać wiersz po wierszu:
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);
}
}