Rust 14: 文件读写

创建文件,写入内容

File::create创建一个文件,如果文件已存在,则会将文件内容清空

use std::fs::File;
use std::io::prelude::*;

// 如果文件已存在,则文件内容会被清空
let path = "D:/test/hello_rust.txt";
//创建文件,mut让文件可以写入
let mut f = File::create(path)?;
// 写入字节数组
let bytes: &[u8] = b"Some Text;\r\n";
f.write_all(bytes)?;
// rust中文件不用手动关闭
// 编译器会将超出作用域的文件自动进行关闭
// 写入中文内容
let txt = "hello你好;";
// rust中字符串默认按utf-8方式编码
f.write_all(txt.as_bytes());

Rust中打开的文件不用手动关闭,Rust编译器会跟踪超出作用域的文件句柄,自动进行关闭。

往文件中追加内容(append)

OpenOptionsappend属性为true,再open文件,则会在文件末尾进行内容追加。

use std::fs::OpenOptions;
let mut file = OpenOptions::new()
        .read(true)
        .write(true)
        .create(true)
        .append(true)
        .open(path).unwrap();
file.write_all(txt.as_bytes());

打开已存在文件

File::open打开已存在的文件,若文件不存在会报错:“系统找不到指定的文件。”。

file.read_to_end(buf: &mut Vec<u8>)会将整个文件内容读入到buf中。

file.read_to_string(buf: &mut String)会将整个文件内容读入到buf中。

//打开已存在的文件,若文件不存在会报错:"系统找不到指定的文件。"
let mut x: File = File::open(path)?;
let mut buf: Vec<u8> = Vec::new();
x.read_to_end(&mut buf);
let y = String::from_utf8(buf).unwrap();
//Some Text;hello你好;
println!("{}", y);

println!("{}","-".repeat(10));
let mut x: File = File::open(path)?;
let mut s = String::new();
x.read_to_string(&mut s);
//Some Text;hello你好;
println!("{}", s);

BufReader按行读取

通过BufReader包装一个已经打开的文件,可以实现带缓冲的读取。

println!("{}","-".repeat(10));
use std::io::BufReader;
let mut f: File = File::open(path)?;
let br = BufReader::new(f);
//按行读取
for line in br.lines() {
    let str: String = line.unwrap();
    println!("{}", str);
}

文件写入

写入二进制内容。

// 将整数类型转换成大端字节序(big endian)
fn i32_to_u8_array(x: i32) -> [u8; 4] {
    let mut a = [0u8; 4];
    a[0] = ((x>>24)&0xff) as u8;
    a[1] = ((x>>16)&0xff) as u8;
    a[2] = ((x>>8)&0xff) as u8;
    a[3] = (x&0xff) as u8;
    a
}
//从大端字节序中还原整数
fn read_i32(buf: &[u8]) -> i32 {
    let mut a: i32 = 0;
    a += buf[0] as i32;
    a <<= 8;
    a += buf[1] as i32;
    a <<= 8;
    a += buf[2] as i32;
    a <<= 8;
    a += buf[3] as i32;
    a
}
//写入二进制内容
let mut f = File::create("D:/test/hello_rust_data")?;
let v:i32 = 0x7fffffff;
let buf = i32_to_u8_array(v);
//文件中是二进制内容: 7fff ffff
f.write(&buf);
let result = read_i32(&buf);
//2147483647
println!("{}", result);

BufWriter带缓冲写入

通过BufWriter包装一个已经打开的文件,可以实现带缓冲的写入。最后记得flush(),以确保缓冲中的内容全部写入文件。

//创建文件,mut让文件可以写入
use std::io::BufWriter;
let mut f = File::create(path)?;
let mut bw = BufWriter::new(f);
// 带缓冲写入
bw.write(b"ABC");
bw.write(b"123");
//确保缓冲中的内容全部写入文件
bw.flush();
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值