在后端开发中,文件读写是非常常见的需求,例如日志记录、配置文件管理、上传文件处理以及数据导入导出等。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 开发能力的重要一步。