返回

TypeScript 中的 Node.js 可写流(Writable Stream)

前端

Node.js TypeScript#5. Writable Stream(可写流)

可写流是一种数据流,用于将数据写入某个目的地,例如文件、网络套接字或另一个流。在 Node.js TypeScript 中,可写流由 Writable 类表示,它提供了用于写入数据的各种方法。

理解可写流

可写流是一种半双工流,这意味着它允许数据在一个方向(从源到目的地)流动。它由以下关键属性和方法定义:

  • write(chunk, [encoding], [callback]):写入数据块。
  • end([chunk], [encoding], [callback]):结束流,写入可选的最终数据块。
  • on('data'):当写入数据时触发的事件监听器。
  • on('finish'):当流结束时触发的事件监听器。
  • on('error'):当写入过程中发生错误时触发的事件监听器。

使用可写流

使用可写流非常简单。以下示例演示如何创建可写流并向文件写入数据:

import { Writable } from 'stream';

const fs = require('fs');
const outputFile = 'output.txt';

const writableStream = new Writable({
  write: (chunk, encoding, callback) => {
    fs.appendFile(outputFile, chunk, encoding, callback);
  },
  final: (callback) => {
    console.log('All data has been written to the file');
    callback();
  }
});

writableStream.write('Hello World!', 'utf8');
writableStream.end('This is the end of the file.');

管道(Pipe)

管道是一种将一个可读流连接到一个可写流的技术。这允许数据从一个流自动流向另一个流,而无需手动管理数据传输。

import { createReadStream, createWriteStream } from 'fs';

const inputFile = 'input.txt';
const outputFile = 'output.txt';

const readStream = createReadStream(inputFile);
const writeStream = createWriteStream(outputFile);

readStream.pipe(writeStream);

处理回压(Backpressure)

回压是一种机制,可防止可写流被写入速度过快的数据压倒。当可写流无法处理传入数据的速率时,它会发出 'drain' 事件。数据生产者应该停止写入数据,直到可写流处理完积压的数据并再次发出 'drain' 事件。

示例:

import { Writable } from 'stream';

const writableStream = new Writable({
  write: (chunk, encoding, callback) => {
    // 处理数据...

    // 如果缓冲区已满,则暂停写入
    if (this.bufferSize > 1000) {
      this.pause();
    }

    callback();
  },
  drain: () => {
    // 继续写入数据
    this.resume();
  }
});

结论

可写流是 Node.js TypeScript 中处理数据流的强大工具。通过理解可写流的工作原理以及如何使用管道和处理回压,你可以有效地将数据写入文件、网络或其他目的地。