Node.js 文件读取与复制相关内容

Node.js 文件读取与复制相关内容 的系统总结,包括 同步读取、异步读取、流式读取、复制操作、两者对比及内存测试。


🧩 一、Node.js 文件读取方式总结

Node.js 使用 fs(文件系统)模块进行文件操作:

1. 同步读取(Blocking)

js 复制代码
const fs = require('fs');
const data = fs.readFileSync('file.txt', 'utf-8');
console.log(data);
  • ✅ 优点:逻辑简单,适合初始化配置、命令行工具等无需并发场景。
  • ❌ 缺点:阻塞线程 ,读取大文件会卡住整个应用。
    当然可以!下面是一个使用 Node.js 同步方式进行文件复制 的完整例子,先同步读取文件内容,再同步写入到目标文件。

🧩 示例:使用 fs.readFileSync + fs.writeFileSync 实现文件复制

js 复制代码
const fs = require('fs');

try {
  // 同步读取源文件内容
  const data = fs.readFileSync('source.txt', 'utf-8');

  // 同步写入到目标文件
  fs.writeFileSync('target.txt', data);

  console.log('文件复制成功 ✅');
} catch (err) {
  console.error('复制失败 ❌', err);
}

🔍 说明:

  • fs.readFileSync(path, encoding):阻塞方式读取文件内容
  • fs.writeFileSync(path, data):阻塞方式将内容写入文件
  • 适合小型文本文件复制(例如:配置文件、日志等)

🚫 注意:

  • 会阻塞事件循环,若文件大或复制频繁,不适合用在服务端生产环境。
  • 大文件建议使用流式复制方式。

2. 异步读取(Non-blocking)

js 复制代码
const fs = require('fs');
fs.readFile('file.txt', 'utf-8', (err, data) => {
  if (err) throw err;
  console.log(data);
});
  • ✅ 优点:非阻塞、适合高并发,不会卡住主线程。
  • ❌ 缺点:逻辑较复杂,需使用回调、Promise 或 async/await。

3. 流式读取(Stream)

js 复制代码
const fs = require('fs');
const readStream = fs.createReadStream('file.txt', 'utf-8');

readStream.on('data', chunk => {
  console.log('读取块:', chunk);
});

readStream.on('end', () => {
  console.log('读取完成');
});
  • ✅ 优点:适合读取大文件、低内存消耗
  • ❌ 缺点:实现复杂,处理逻辑需分块处理。

🧪 二、读取场景对比

方式 适合场景 特点
同步读取 小文件、本地 CLI 工具等 简单,阻塞线程
异步读取 Web 服务、文件上传 非阻塞,高性能
流式读取 视频、大型日志、备份等 节省内存,分块

📁 三、Node.js 文件复制方式

1. 同步复制

js 复制代码
const fs = require('fs');
fs.copyFileSync('source.txt', 'target.txt');
  • ✅ 简单,适合少量小文件。
  • ❌ 阻塞线程,大量并发时不可用。

2. 流式复制(推荐)

js 复制代码
const fs = require('fs');
const readStream = fs.createReadStream('source.txt');
const writeStream = fs.createWriteStream('target.txt');

readStream.pipe(writeStream);
  • ✅ 非阻塞,适合大文件。
  • ✅ 边读边写,内存占用低。
  • ❌ 无法轻松控制复制进度或中断。

⚖️ 四、复制方式对比

方法 内存占用 性能 使用场景
同步复制 高 低 小型项目、工具类
流式复制 低 高 服务端、大文件

📊 五、内存占用测试示例

可以通过 process.memoryUsage() 查看 Node.js 内存使用:

js 复制代码
console.log(process.memoryUsage());

示例:对比读取一个 500MB 文件时的内存变化:

js 复制代码
// 流式读取内存较低
const stream = fs.createReadStream('bigfile.txt');
stream.on('data', chunk => {
  console.log(process.memoryUsage().heapUsed);
});

// readFileSync 读取整个文件占用大
const content = fs.readFileSync('bigfile.txt');
console.log(process.memoryUsage().heapUsed);

🧠 总结重点

功能 同步 异步 流式
阻塞 ✅ 是 ❌ 否 ❌ 否
内存消耗 ❌ 高 ⚠️ 中 ✅ 低
实现复杂度 ✅ 简单 ⚠️ 中等 ❌ 高
适合场景 启动、工具 Web 服务 大文件处理

相关推荐
damoluomu13 小时前
Node 的 Headless 出厂没有前台,Java 的 Headless 是从门户里长出来的
java·开发语言·node.js
Dumbness14 小时前
一个手机号验证码登录接口的五个坑:无限发码、无限试码,传个数字就让 Express 进程退出
node.js·express
怒放的生命199115 小时前
本地用 pnpm 省磁盘,团队继续用 npm:极简实践
前端·npm·node.js
Hone1 天前
我把「自动发文章到掘金」做成了一个 Agent 技能:juejin-skills
node.js·ai编程·前端工程化
Dumbness2 天前
二十行手写的 SKILL.md 头部解析,遇到 YAML 的折叠写法、单引号和嵌套键就读错:和 js-yaml 逐条对照
node.js·ai编程
只睡四小时2 天前
MCP 弃用 SSE?Node 分帧漏 81.7% 事件
node.js·webassembly·实时通信·mcp·streamable http
hey you~3 天前
个体户门店办理400电话,如何对接订单系统实现来电弹窗
node.js·webhook·400电话·门店数字化·来电弹窗·订单系统对接
YIAN4 天前
RAG 学到最后,我真正学会的不是“检索”,而是让系统知道自己缺什么
langchain·node.js·llm
用户11977079480734 天前
GitHub 电商开源项目分享:用 sharp 批量出饰品主图,试了裁剪、细节图和色彩配置文件三个坑
前端·node.js
donecoding4 天前
pnpm 配好了,为什么执行的还是另一份?命令入口与运行时排查
node.js·前端工程化