Cách thức mục đích chung hiệu quả nhất để đọc các tệp "lớn" (có thể là văn bản hoặc nhị phân), mà không đi vào lãnh thổ unsafe
? Tôi đã ngạc nhiên khi có ít kết quả có liên quan khi tôi tìm kiếm trên web về "gỉ đọc tệp lớn trong các đoạn". Ví dụ: một trong các trường hợp sử dụng của tôi là tính toán tổng kiểm tra MD5 cho tệp bằng cách sử dụng rust-crypto
(mô-đun Md5
cho phép bạn thêm &[u8]
khối lặp lại).Cách hiệu quả nhất để đọc tệp lớn theo khối
Đây là những gì tôi có, mà dường như để thực hiện tốt hơn một chút so với một số phương pháp khác như read_to_end
:
const CAP: usize = 1024 * 128;
let mut file = try!(File::open("my.file"));
let mut reader = BufReader::with_capacity(CAP, file);
loop {
let length = {
let buffer = try!(reader.fill_buf());
// do stuff with buffer here
buffer.len()
};
if length == 0 { break; }
reader.consume(length);
}
Cảm ơn câu trả lời! Tôi nghĩ rằng 'BufReader' rất hữu ích cho tôi vì nó đã thay đổi kích cỡ bộ đệm cho tôi khi tôi đọc đến cuối người đọc, nhưng tôi nhận ra nó khá tầm thường ... –
* vì nó đã thay đổi kích thước bộ đệm * - tôi nghi ngờ rằng nó thay đổi kích thước bộ đệm, nhưng slice có lẽ được rút ngắn để phản ánh số byte đã đọc. Nhưng bạn đúng rằng giá trị trả về của 'Read :: read' cho bạn biết số lượng bộ đệm là hợp lệ. Nó ** rất quan trọng ** để sử dụng, nếu không bạn có thể gặp rắc rối như Heartbleed, nơi một bộ đệm được tái sử dụng với nội dung cũ! Đó có thể là một lý do tốt để sử dụng 'BufReader'. – Shepmaster
Xin lỗi, bạn nói đúng, ý tôi là "rút ngắn độ dài của bộ đệm". –