9 流与文件处理之流的组合与转换

在上一篇文章中,我们探讨了 Node.js 中如何进行文件的读取与写入操作,了解了 fs 模块中的一些基本方法。在这一篇中,我们将继续深入流的概念,主要着眼于如何将不同类型的“流”进行组合与转换,以实现更复杂的文件处理和数据处理场景。

1. 理解流的概念

在 Node.js 中,流是一种用于处理数据的抽象接口。流可以是可读的、可写的或双向的(即同时可读可写)。流与常规文件处理方法的相比,具有内存占用少、处理大文件时性能优越等优点。我们将重点关注以下几种流类型:

  • 可读流:用于读取数据,例如 fs.createReadStream()
  • 可写流:用于写入数据,例如 fs.createWriteStream()
  • 转换流:用于在读取和写入之间对数据进行转换,例如可以使用 stream.Transform 类。

2. 流的组合与转换

流的组合允许我们将一个流的输出连接到另一个流的输入,这样我们就可以在处理数据时创建一个流水线。通过转换流,我们可以在数据传输过程中进行格式转换、压缩等操作。

2.1 示例:从文件读取数据,转为大写后写入新文件

我们来创建一个简单的示例,将一个文本文件的内容读取出来,将其转换为大写,并将转换后的内容写入另一个文件。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const fs = require('fs');
const { Transform } = require('stream');

// 创建转换流:将数据转换为大写
const uppercaseTransform = new Transform({
transform(chunk, encoding, callback) {
// 将内容转换为大写
this.push(chunk.toString().toUpperCase());
callback();
},
});

// 创建可读流用于读取文件
const readStream = fs.createReadStream('input.txt');

// 创建可写流用于写入文件
const writeStream = fs.createWriteStream('output.txt');

// 将读流连接到转换流,再连接到写流
readStream.pipe(uppercaseTransform).pipe(writeStream);

// 监听事件
writeStream.on('finish', () => {
console.log('文件转换完成,内容已写入output.txt');
});

在上述代码中,我们首先定义了一个 Transform 流,命名为 uppercaseTransform,它会将接收到的数据块转换为大写。然后,我们通过 pipe 方法将 readStream 的输出连接到 uppercaseTransform,并最终连接到 writeStream。这样,数据将沿着这个流管道依次被读取、转换并写入。

2.2 处理 JSON 数据流

在实际项目中,我们也常常需要处理 JSON 数据。假设我们有一个 JSON 文件,想将每一条记录中的某个字段转换或重新格式化。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const fs = require('fs');
const { Transform } = require('stream');

// 创建转换流,将 JSON 数据中特定字段增加一个属性
const jsonTransform = new Transform({
writableObjectMode: true,
readableObjectMode: true,
transform(chunk, encoding, callback) {
// 假设每个 chunk 是一个 JSON 对象
const obj = JSON.parse(chunk.toString());
obj.newField = '新增字段'; // 添加新字段
this.push(JSON.stringify(obj) + '\n'); // 串联成字符串并换行
callback();
},
});

// 创建可读流用于读取 JSON 文件
const readStream = fs.createReadStream('data.json', { encoding: 'utf8' });

// 创建可写流用于写入更新后的 JSON 数据
const writeStream = fs.createWriteStream('output_data.json');

// 将读流连接到 JSON 转换流,再连接到写流
readStream
.pipe(require('split')()) // 将单个大字符串切割成一个个 JSON 行
.pipe(jsonTransform)
.pipe(writeStream);

// 监听事件
writeStream.on('finish', () => {
console.log('JSON 数据处理完毕,并已写入output_data.json');
});

在这个示例中,我们首先使用 split 模块(请确保你已安装 split)将读取的文件按行切割。每一行数据视作一个 JSON 对象,并通过 Transform 流添加新字段。最终,处理后的对象将被写入新文件。

3. 小结

在本篇教程中,我们通过实例学习了如何在 Node.js 中组合与转换流,处理文件和 JSON 数据。通过流的组合,我们可以构建高效的数据处理管道,使代码更简洁、内存使用更高效,这对于处理大数据量的文件尤为重要。

接下来,我们将深入探讨中间件与框架的设计,特别是 Express 框架的应用。在下一篇的内容中,我们将详细介绍 Express 的基本用法和其强大的功能。

请继续关注我们的系列教程,掌握 Node.js 后端开发的更深层次知识!

9 流与文件处理之流的组合与转换

https://zglg.work/nodejs-backend-one/9/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论