Was ist die effizienteste Allzweckmethode zum Lesen von "großen" Dateien (die Text oder binär sein können), ohne in unsafe
Gebiet zu gehen? Ich war überrascht, wie wenige relevante Ergebnisse es gab, als ich eine Websuche nach "Rost las große Datei in Stücken" durchführte.Der effizienteste Weg, um große Dateien in Chunks zu lesen
Zum Beispiel einer meiner Anwendungsfälle ist ein MD5-Prüfsumme für eine Datei rust-crypto
mit berechnen (das Md5
Modul ermöglicht es Ihnen &[u8]
chunks iterativ hinzufügen).
Hier ist, was ich habe, was etwas besser auszuführen scheint als einige andere Methoden wie 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);
}
Danke für die Antwort! Ich dachte 'BufReader' war nützlich für mich, da es den Puffer für mich änderte, als ich das Ende des Lesers erreichte, aber ich merkte, dass das ziemlich trivial ist ... –
* da es den Puffer änderte * - bezweifle ich das ändert die Größe des Puffers, aber die Schicht wird vermutlich verkürzt, um die Anzahl der gelesenen Bytes widerzuspiegeln. Aber Sie haben Recht, dass der Rückgabewert von "Read :: read" Ihnen sagt, wie viel des Puffers gültig ist. Es ist sehr wichtig ** das zu verwenden, sonst kann es zu einem Problem wie Heartbleed kommen, wo ein Puffer mit alten Inhalten wiederverwendet wird! Das könnte ein guter Grund sein, 'BufReader' zu verwenden. – Shepmaster
Sorry, du hast recht, ich meinte "verkürzte die Länge des Puffers". –