Node.js 编程实战:文件读写操作

在后端开发中,文件读写是非常常见的需求,例如日志记录、配置文件管理、上传文件处理以及数据导入导出等。Node.js 提供了内置的 fs(File System)模块,使得我们可以高效地与文件系统进行交互。理解并掌握 Node.js 的文件读写方式,是每一个 Node.js 开发者的必备基础。


一、fs 模块简介

fs 模块是 Node.js 的核心模块之一,无需额外安装即可直接使用。它提供了同步和异步两套 API,用于完成文件的创建、读取、写入、删除以及目录操作等功能。

在实际开发中,Node.js 更推荐使用异步文件操作,因为同步方法会阻塞事件循环,影响服务器的并发处理能力。同步方法一般只适用于脚本工具或启动阶段的简单逻辑。


二、文件读取操作

1. 异步读取文件

异步读取是最常用的方式,通过回调函数在文件读取完成后处理结果。该方式不会阻塞主线程,适合高并发场景。

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

fs.readFile('example.txt', 'utf-8', (err, data) => {
  if (err) {
    console.error('读取失败:', err);
    return;
  }
  console.log('文件内容:', data);
});

这种方式适合读取体积较小的文件,如配置文件或文本内容。


2. 同步读取文件

同步读取会阻塞程序执行,直到文件读取完成,因此在 Web 服务中应尽量避免使用。

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

try {
  const data = fs.readFileSync('example.txt', 'utf-8');
  console.log(data);
} catch (err) {
  console.error(err);
}

同步读取通常用于命令行工具或程序初始化阶段。


三、文件写入操作

1. 异步写入文件

异步写入文件会在文件不存在时自动创建文件,在文件存在时覆盖原有内容。

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

fs.writeFile('output.txt', 'Hello Node.js', 'utf-8', err => {
  if (err) {
    console.error('写入失败:', err);
    return;
  }
  console.log('写入成功');
});

这种方式适合生成日志、导出数据等场景。


2. 追加写入文件

如果希望在原有内容后追加数据,可以使用 appendFile 方法。

js 复制代码
fs.appendFile('log.txt', '新的一条日志\n', err => {
  if (err) console.error(err);
});

这是日志系统中非常常见的用法。


四、使用 Promise 与 async/await 操作文件

从 Node.js v10 开始,fs 模块提供了 fs.promises API,使文件操作更加现代化,也更易于错误处理。

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

async function readFileAsync() {
  try {
    const data = await fs.readFile('example.txt', 'utf-8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

readFileAsync();

这种方式代码结构清晰,尤其适合复杂业务逻辑。


五、大文件读写与 Stream

当文件体积较大时,一次性读入内存会造成内存压力。这时应使用**流(Stream)**进行分段读写。

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

const readStream = fs.createReadStream('bigfile.txt');
const writeStream = fs.createWriteStream('copy.txt');

readStream.pipe(writeStream);

流的方式可以显著降低内存占用,非常适合处理视频、日志或大规模数据文件。


六、文件操作中的常见注意点

在实际开发中,需要特别注意以下问题:

  • 文件路径建议使用 path 模块拼接,避免跨平台问题
  • 文件操作需要做好错误处理,防止程序崩溃
  • 避免在高并发服务中使用同步文件 API
  • 大文件优先使用 Stream 方式处理

这些细节往往决定了系统的稳定性和性能表现。


七、总结

Node.js 的文件读写操作功能强大且灵活,从简单的文本读写到复杂的大文件流处理,都有成熟的解决方案。合理选择同步、异步或流式操作方式,不仅可以提升程序性能,还能让代码更加健壮。在实际项目中,结合业务场景选择合适的文件操作策略,是提升 Node.js 开发能力的重要一步。

相关推荐
xUxIAOrUIII2 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
PineappleCoder2 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化
Dolphin_Home2 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
zfj3212 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_462446232 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
JIngJaneIL2 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码2 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
澄江静如练_3 小时前
列表渲染(v-for)
前端·javascript·vue.js
小信啊啊3 小时前
Go语言切片slice
开发语言·后端·golang