📜  Node.js-流(1)

📅  最后修改于: 2023-12-03 15:17:57.416000             🧑  作者: Mango

Node.js流

在Node.js中,流(stream)是一种处理流数据(streaming data)的抽象接口。流可以是只读的、只写的,也可以是可读可写的。它们提供了类似于UNIX shell管道(pipe)的基本功能,这意味着它们可以被链接起来来处理数据流。流很适合处理大型文件或网络数据,因为它们能够按需处理数据,而不是一次性将整个数据块加载到内存中。

流的类型

在Node.js中有四种基本的流类型:

  1. 可读流(Readable):从 I/O 系统源读取数据,比如从文件系统读取数据或从网络/socket中读取数据。
  2. 可写流(Writable):向 I/O 系统汇入数据,比如向文件系统或网络/socket写入数据。
  3. 双向流(Duplex):既可以读,也可以写。
  4. 转换流(Transform):数据在读写之间进行转换的流。
流的用法
可读流(Readable)

创建可读流:

const fs = require('fs');
const readableStream = fs.createReadStream('input.txt');

读取数据:

let data = '';
readableStream.on('data', (chunk) => {
  data += chunk;
});
readableStream.on('end', () => {
  console.log(data);
});
可写流(Writable)

创建可写流:

const fs = require('fs');
const writableStream = fs.createWriteStream('output.txt');

写入数据:

writableStream.write('Hello world!', 'UTF8');
双向流(Duplex)

创建双向流:

const net = require('net');
const duplexStream = new net.Socket();
转换流(Transform)

创建转换流:

const { Transform } = require('stream');

const upperCaseTransform = new Transform({
  transform(chunk, encoding, callback) {
    callback(null, chunk.toString().toUpperCase());
  }
})

使用转换流:

const { Readable } = require('stream');

const readableStream = new Readable({
  read() {
    this.push('hello\n');
    this.push('world\n');
    this.push(null);
  }
});

readableStream
  .pipe(upperCaseTransform)
  .pipe(process.stdout);
流的处理

流数据的处理包括流的读取处理和流的写入处理。

流的读取处理

流的读取处理需要用到可读流的 read 方法或者使用 on('data', callback) 事件处理。

使用 read 方法:

readableStream.read();

使用 on 方法:

readableStream.on('data', (chunk) => {
  console.log(chunk.toString());
});
流的写入处理

流的写入处理需要使用可写流的 write 方法或者使用 writeableStream.end() 方法来结束写入。

使用 write 方法:

writableStream.write('Hello world!', 'UTF8');

使用 end 方法:

writableStream.end();
总结

流是Node.js中非常强大的一种抽象接口,它支持异步处理数据,可以按需读写大量数据,还可以被链接起来处理数据流。本文介绍了 Node.js 中四种基本的流类型,包括可读流、可写流、双向流和转换流的使用方法,同时也介绍了流的读取处理和写入处理。在Node.js中有很多流模块可以使用,比如fszlibhttpnet等,可以加强Node.js的处理能力和数据处理的效率。