面试题答案
一键面试设计思路
- 逐行读取:使用
BufReader
逐行读取文件,避免一次性将整个大文件读入内存。 - 敏感词匹配:将敏感词汇存储在
HashSet
中,以提高查找效率。使用replace
方法替换每行中的敏感词汇。 - 写入文件:使用
BufWriter
将处理后的内容写入新文件,避免频繁的磁盘I/O操作。如果需要写回原文件,可以先写入临时文件,然后替换原文件。
关键代码
use std::fs::{File, OpenOptions};
use std::io::{BufRead, BufReader, BufWriter, Write};
use std::collections::HashSet;
fn main() {
let input_file_path = "input.txt";
let output_file_path = "output.txt";
let sensitive_words: HashSet<&str> = HashSet::from([
"敏感词1", "敏感词2", "敏感词3"
]);
let replacement = "替换字符串";
let input_file = File::open(input_file_path).expect("无法打开输入文件");
let output_file = OpenOptions::new()
.write(true)
.create(true)
.truncate(true)
.open(output_file_path)
.expect("无法创建输出文件");
let reader = BufReader::new(input_file);
let mut writer = BufWriter::new(output_file);
for line in reader.lines() {
let line = line.expect("读取行失败");
let new_line = sensitive_words.iter()
.fold(line, |acc, word| acc.replace(word, replacement));
writeln!(writer, "{}", new_line).expect("写入行失败");
}
}
如果要写回原文件,可以在上述代码基础上添加以下步骤:
// 引入文件替换的库
use std::fs::rename;
// 在写入完成后,将临时文件替换原文件
rename(output_file_path, input_file_path).expect("替换文件失败");