Node.js 读取和写入文件

文章类型:node

发布者:hp

发布时间:2025-02-27

一:分类

(1):同步读写

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());

(2):异步回调

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('文件已更新!');
  });
});

(3): ‌Promise + Async/Await‌

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();

(4):流处理(大文件)

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 防数据竞争