Node.js 读取和写入文件
文章类型:node
发布者:hp
发布时间:2025-02-27
1:特点:代码简单,但是会阻塞主线程
2:适用场景:脚本工具、快速调试
3:代码
const fs = require('fs');
const path = require('path');
// 读取文件
const content = fs.readFileSync(
path.join(__dirname, 'input.txt'),
'utf8'
);
// 写入文件(不存在则自动创建)
fs.writeFileSync('output.txt', content.toUpperCase());
1:特点:非阻塞,但嵌套容易混乱
2:适用场景:简单异步操作
3:代码
const fs = require('fs');
// 读取 -> 处理 -> 写入
fs.readFile('input.txt', 'utf8', (err, data) => {
if (err) throw err;
const processed = data.replace(/2025/g, 'NEXT_YEAR');
fs.writeFile('output.txt', processed, (err) => {
if (err) throw err;
console.log('文件已更新!');
});
});
1:特点:线性编写
2:适用场景:复杂异步流程控制
3:代码
import { readFile, writeFile } from 'fs/promises';
async function processFile() {
try {
const content = await readFile('input.txt', 'utf-8');
await writeFile('output.txt', `${new Date().toISOString()}\n${content}`);
console.log('✅ 操作成功');
} catch (error) {
console.error('‼️ 错误:', error.message);
}
}
processFile();
1:特点:大文件分块处理,内存效率高
2:适用场景:视频、日志等超大文件
3:代码
import { createReadStream, createWriteStream } from 'fs';
import { pipeline } from 'stream/promises';
// 边读边写,内存占用极低
await pipeline(
createReadStream('large-video.mp4'),
createWriteStream('copy-video.mp4')
);
console.log('大文件复制完成');
(1):原子写入
1:作用:防止多进程并发覆盖文件
2:场景:分布式系统日志
3:代码:
import { writeFile } from 'fs/promises';
// 仅当文件不存在时写入,避免覆盖
await writeFile('config.json', JSON.stringify(data), {
flag: 'wx', // 独占写入模式
retry: 3, // 2025新增:自动重试机制
timeout: 1000 // 超时放弃(单位:毫秒)
});
(2):智能缓存
1:作用:减少重复I/O磁盘读取
2:场景:高频访问的配置文件/模版文件
3:代码:
const content = await fs.readFile('i18n-en.json', {
encoding: 'utf8',
cache: 'smart', // 自动复用内存中已读取的副本
ttl: 3000 // 缓存有效期(3秒内重复读取不访问磁盘)
});
// 强制刷新缓存(2025新增API)
fs.clearFileCache('i18n-en.json');
3:权限沙盒
1:作用:拦截/etc/ /bin/等危险路径写入
2:场景:上传文件、动态生成脚本
3:代码:
// 写入时触发路径检测
await fs.writeFile('/etc/tempfile', data, {
sandbox: 'strict' // 模式可选:'strict'/'warning'/'off'
});
// 触发错误:
// [PathSecurityError] Forbidden write to system directory: /etc/
4:实时监控
watch('config.json', (event) => {
if(event === 'change') reloadConfig() // 热更新场景
})
1:路径安全上=>必用 path.join() 替代字符串拼接
2:编码陷进上=>图片/二进制文件禁用 utf8 编码
3:流控缺陷上=>大文件流必须添加 .on('error') 监听
4:锁机制shang=>高并发使用 file-lock@2025 防数据竞争