У меня проблемы с открытием файла. Большинство примеров считывают файлы в String
или читают весь файл в Vec
. Мне нужно прочитать файл в чанки фиксированного размера и сохранить эти чанки в массив (Vec
) чанков.
Например, у меня есть файл с именем my_file
размером точно 64 КБ, и я хочу прочитать его кусками по 16 КБ, поэтому я получу Vec
размера 4, где каждый элемент является другим Vec
с размером 16Kb (0x4000 байт).
После прочтения документации и проверки ответов на переполнение стека я смог получить что-то вроде этого:
let mut file = std::fs::File::open("my_file")?;
// ...calculate num_of_chunks 4 in this case
let list_of_chunks = Vec::new();
for chunk in 0..num_of_chunks {
let mut data: [u8; 0x4000] = [0; 0x4000];
file.read(&mut data[..])?;
list_of_chunks.push(data.to_vec());
}
Хотя это, кажется, работает нормально, выглядит немного запутанным. Я читаю:
- Для каждой итерации создайте новый массив в стеке
- Чтение фрагмента в массив
- Скопируйте содержимое массива в новый
Vec
, а затем переместите Vec
в list_of_chunks
Vec
.
Я не уверен, что это идиоматично или вообще возможно, но я бы предпочел что-то вроде этого:
- Создайте
Vec
с num_of_chunk
элементами, где каждый элемент является другим Vec
размером 16 КБ.
- Считать файловый блок прямо в правильный
Vec
Нет копирования, и мы проследим, чтобы перед чтением файла была выделена память.
Возможен ли такой подход? или есть лучший обычный / идиоматический / правильный способ сделать это?
Мне интересно, если Vec
правильный тип для решения этой проблемы. Я имею в виду, мне не нужно будет увеличивать массив после прочтения файла.