使用 Node.js 进行 Shell 脚本编程
您可以购买本书的离线版本(HTML、PDF、EPUB、MOBI),并支持免费在线版本。
(广告,请勿屏蔽。)

11 流式处理方法



11.1 写入标准输出 (stdout)

以下是写入 stdout 的三种选择

11.1.1 通过 `console.log()` 写入 stdout

console.log(format, ...args) 写入 stdout 并始终附加换行符 '\n'(即使在 Windows 上)。第一个参数可以包含占位符,这些占位符的解释方式与 util.format() 相同

console.log('String: %s Number: %d Percent: %%', 'abc', 123);

const obj = {one: 1, two: 2};
console.log('JSON: %j Object: %o', obj, obj);

// Output:
// 'String: abc Number: 123 Percent: %'
// 'JSON: {"one":1,"two":2} Object: { one: 1, two: 2 }'

第一个参数之后的所有参数始终显示在输出中,即使没有足够的占位符。

11.1.2 通过 Node.js 流写入 stdout

process.stdoutstream.Readable 的实例。这意味着我们可以像使用任何其他 Node.js 流一样使用它 - 例如

process.stdout.write('two');
process.stdout.write(' words');
process.stdout.write('\n');

前面的代码等效于

console.log('two words');

请注意,在这种情况下,末尾没有换行符,因为 console.log() 始终会添加一个换行符。

如果我们对大量数据使用 .write(),我们应该考虑反压,如 §9.5.2.1 “writable.write(chunk) 中所述。

以下方法适用于 process.stdout§11.4 “Node.js 流式处理方法”

11.1.3 通过 Web 流写入 stdout

我们可以将 process.stdout 转换为 Web 流并写入它

import {Writable} from 'node:stream';
const webOut = Writable.toWeb(process.stdout);
const writer = webOut.getWriter();
try {
  await writer.write('First line\n');
  await writer.write('Second line\n');
  await writer.close();
} finally {
  writer.releaseLock()
}

以下方法适用于 webOut§11.5 “Web 流式处理方法”

11.2 写入标准错误 (stderr)

写入 stderr 的方法与写入 stdout 类似

有关更多信息,请参阅上一节。

11.3 从标准输入 (stdin) 读取

以下是读取 stdin 的选项

11.3.1 通过 Node.js 流从 stdin 读取

process.stdinstream.Writable 的实例。这意味着我们可以像使用任何其他 Node.js 流一样使用它

// Switch to text mode (otherwise we get chunks of binary data)
process.stdin.setEncoding('utf-8');
for await (const chunk of process.stdin) {
  console.log('>', chunk);
}

以下方法适用于 webIn§11.4 “Node.js 流式处理方法”

11.3.2 通过 Web 流从 stdin 读取

我们首先必须将 process.stdin 转换为 Web 流

import {Readable} from 'node:stream';
// Switch to text mode (otherwise we get chunks of binary data)
process.stdin.setEncoding('utf-8');
const webIn = Readable.toWeb(process.stdin);
for await (const chunk of webIn) {
  console.log('>', chunk);
}

以下方法适用于 webIn§11.5 “Web 流式处理方法”

11.3.3 通过模块 `'node:readline'` 从 stdin 读取

内置模块 `'node:readline'` 允许我们提示用户以交互方式输入信息 - 例如

import * as fs from 'node:fs';
import * as readline from 'node:readline/promises';

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const filePath = await rl.question('Please enter a file path: ');
fs.writeFileSync(filePath, 'Hi!', {encoding: 'utf-8'})

rl.close();

有关模块 `'node:readline'` 的更多信息,请参阅

11.4 Node.js 流式处理方法

可读流

可写流

11.5 Web 流式处理方法

从以下内容创建 ReadableStream

从 ReadableStream 读取

转换 ReadableStream

使用 WritableStream