2014-12-09 2 views
1

Я пытаюсь взять изображение, которое преобразуется в вектор байтов и записывать эти байты в новый файл. Первая часть работает, и мой код компилируется, но созданный новый файл заканчивается пустым (на нем ничего не написано). Что мне не хватает?Преобразование изображения в байты, а затем запись в новый файл

Есть ли более чистый способ конвертировать Vec<u8> в &[u8], чтобы его можно было написать? То, как я сейчас делаю это, кажется, вроде смешно ...

use std::os; 
use std::io::BufferedReader; 
use std::io::File; 
use std::io::BufferedWriter; 

fn get_file_buffer(path_str: String) -> Vec<u8> { 
    let path = Path::new(path_str.as_bytes()); 
    let file = File::open(&path); 
    let mut reader = BufferedReader::new(file); 
    match reader.read_to_end() { 
     Ok(x) => x, 
     Err(_) => vec![0], 
    } 
} 

fn main() { 
    let file = get_file_buffer(os::args()[1].clone()); 

    let mut new_file = File::create(&Path::new("foo.png")).unwrap(); 
    let mut writer = BufferedWriter::new(new_file); 

    writer.write(String::from_utf8(file).unwrap().as_bytes()).unwrap(); 
    writer.flush().unwrap(); 
} 

ответ

4

Учитывая Vec<T>, вы можете получить &[T] из него двух способов:

  • Возьмите ссылку на разыменовать его, т.е. &*file; это работает, потому что Vec<T> реализует Deref<[T]>, поэтому *file действительно имеет тип [T] (хотя делать это без заимствования, т. е. &*file, не является законным).

  • Вызов метода as_slice().

Как BufWriter docs сказать, «буфер будет записан, когда писатель отбрасывается», так что writer.flush().unwrap() не является строго необходимым, служит только, чтобы сделать обработку ошибок явных.

Но что касается поведения, которое вы описываете, я в основном не наблюдаю. До тех пор, пока вы не столкнетесь с ошибками ввода-вывода, версия, не использующая танец String, будет работать нормально, а с танцем String будет паниковать, если входные данные не являются законными UTF-8 (что, если вы имеете дело с изображений это, вероятно, не будет). String::from_utf8 возвращает None в таких случаях, и поэтому разворачивает эту панику.

Смежные вопросы