如何在Rust中不加载文件到内存,追加内存JSON到换行分隔JSON文件
Rust中高效追加换行分隔JSON到文件(不加载整个文件)
场景说明
现有一个换行分隔的JSON文件,内容如下:
{"name":"butthead"} {"name":"second-butthead"} {"name":"third-butthead"}
内存中已加载一条JSON数据:
{"name":"fourth-butthead"}
需要将内存中的数据追加到文件末尾,最终文件内容符合换行分隔格式,且全程不读取整个文件到内存。
实现方案
直接写入JSON字符串(标准库即可)
如果内存中的数据已经是JSON字符串,直接用标准库的文件操作即可实现追加:
use std::fs::OpenOptions; use std::io::{self, Write}; // 封装追加逻辑的函数 fn append_json_str(file_path: &str, json_str: &str) -> io::Result<()> { // 以追加模式打开文件,文件不存在则自动创建 let mut file = OpenOptions::new() .create(true) .append(true) .open(file_path)?; // 写入JSON字符串并追加换行符,保证格式统一 writeln!(file, "{}", json_str)?; Ok(()) } fn main() -> io::Result<()> { // 内存中的JSON字符串 let target_json = r#"{"name":"fourth-butthead"}"#; // 调用函数追加到指定文件 append_json_str("your_target_file.json", target_json)?; Ok(()) }
从结构体序列化后追加(配合serde)
如果内存中的数据是Rust结构体,可通过serde和serde_json序列化后再追加:
首先在Cargo.toml中添加依赖:
[dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0"
然后编写代码:
use serde::Serialize; use std::fs::OpenOptions; use std::io::{self, Write}; // 定义对应JSON结构的结构体 #[derive(Serialize)] struct Person { name: String, } fn append_json_data<T: Serialize>(file_path: &str, data: &T) -> io::Result<()> { let mut file = OpenOptions::new() .create(true) .append(true) .open(file_path)?; // 将结构体序列化为JSON字符串 let json_str = serde_json::to_string(data)?; // 写入文件并添加换行 writeln!(file, "{}", json_str)?; Ok(()) } fn main() -> io::Result<()> { // 内存中的结构体数据 let person = Person { name: "fourth-butthead".to_string(), }; append_json_data("your_target_file.json", &person)?; Ok(()) }
核心要点
- 使用
OpenOptions::append(true)打开文件时,操作系统会直接将文件指针定位到末尾,无需读取原文件内容,完全符合"不加载整个文件"的要求。 writeln!宏自动添加换行符,确保新的JSON条目单独占一行,维持换行分隔JSON的格式规范。- 两种方案都仅在内存中保留待写入的单条数据,内存占用极低,适合处理大文件。
内容的提问来源于stack exchange,提问作者sneakycrow
相关产品推荐
相关产品推荐

