Rust in Action笔记 第七章 文件和存储

  1. serde 库提供序列化(serialize)和反序列化(deserialize)的特征,通过derive生成,可以把rust的自定义类型(struct)转换成多种常用的兼容类型例如JSON、CBOR、bincode,用于在网络间传输,其中JSON是比较常用的类型,特点是兼顾human-readable和machine-readable,另外两种仅仅是machine-readable,Page215给了一个范例;
  2. 检索一个文件的内容采用hexdump的方式,把一系列字节流转化成2个16进制的数字(也就是正好一个字节),这种视图叫做fview(file view文件视图),表7.2展示了一个fview的输入和输出表7.2
  3. 多行字符串作为原始字符串时(raw string)不需要将双引号转义,原始字符串的pattern是前缀r,分隔符#,还有额外的前缀b表示后面的字符串要看作字节(&[u8])而不是UTF-8字符(&str),下图是一个例子raw string
  4. f.read_exact(&mut buffer)方法把数据从源头fbuffer中,当buffer满的时候才会停止,如果buffer比f中的数据要长,会返回一个error;std::env::args()用于读命令行的参数;
  5. std::fs::OpenOptions可以用来创建可写的文件,与File::openFile::create不同,它可以定制化一些功能,open和create的区别如下表所示table 7.3
  6. 处理文件路径的时候推荐使用Path库,有3个好处,a.明确开发者的意图,例如set_extension()方法能设置扩展名;b. 多平台兼容性,不同的操作系统对文件路径的处理不通,例如有的操作系统对文件名的大小写敏感而有的不,还有不同的操作系统对路径分隔符的使用也不同;c. 易于debug,Path库提供了很多好用的API来处理文件路径;下表给出了一个对比std::Stringstd::path::Path处理文件路径的区别table 7.4
  7. 7.5节简单构建了一个内存数据库的项目,介绍了cargo.tomllibbin的使用规则以及调用路径,是一个小而全的软件工程实践项目,对于个人开发rust工具有很大的启发,Page222;
  8. 7.6.1节介绍了条件编译(conditional compilation)的用法,在需要条件编译的语句上方加入#[cfg(target_os="windows")]可以让该语句仅在windows系统下编译,对于·非·操作,没有!=符号,而是#[cfg(not(...))],可以设置的编译条件还有target_arch、target_env等,详见Page227;
  9. std::io::ErrorKind::UnexpectedEof错误是当程序读到文件结尾时报的错误,EOF是一个0字节(0u8),在文件结尾没有一个特殊的标记来表示文件已经结束,因此读到结尾无法再继续读的时候会抛出这个错误;
  10. 7.7.3节介绍了写入二进制数据到磁盘中的顺序问题,可以制定大端/小端写入的方式,注意i8, u8这样的数据是不用制定大端小端的,因为只有一个字节,像u32, f64这种就可以指定,写入效果可见Page233;
  11. 7.7.3节介绍了写入磁盘的校验方法,常见的3种是奇偶校验法(parity bit)、循环冗余法(CRC32)、加密哈希法(Cryptographic hash function),他们之间的对比如下表所示table 7.8

猜你喜欢

转载自blog.csdn.net/Mint2yx4/article/details/131396607