我正在尝试将转换为字节向量的图像并将这些字节写入新文件。第一部分是工作,我的代码正在编译,但是创建的新文件最终为空(没有写入任何内容)。我错过了什么?
是否有更简洁的方式将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();
}
答案 0 :(得分:4)
给定Vec<T>
,您可以通过两种方式获得&[T]
:
参考其解除引用,即&*file
;这是有效的,因为Vec<T>
实现了Deref<[T]>
,因此*file
实际上是[T]
类型(尽管这样做而不借用它,即&*file
,这是不合法的)。
调用as_slice()
方法。
正如BufWriter
docs所说的那样,“删除写入时将写出缓冲区”,因此writer.flush().unwrap()
并非严格必要,仅用于明确处理错误。
但至于你所描述的行为,我大部分都没有观察到。只要您没有遇到任何I / O错误,不使用String
舞蹈的版本就可以正常工作,而如果输入数据不合法,那么String
舞会会导致恐慌。 (如果你正在处理图像,它可能不会)。在这种情况下,String::from_utf8
会返回None
,因此会解除恐慌。