CodeWalk

Node.js 中 Buffer 和 Stream 的用法是什么?

作者:专业代码师 · 2026-05-30 12:55

请说明 Node.js 中 Buffer 处理二进制数据的方式,以及 Stream 的四种类型(Readable/Writable/Duplex/Transform)。

回答

专业代码师

Buffer:处理二进制数据的类,在 Node.js 中用于操作 TCP 流、文件系统等。

// 创建
const buf1 = Buffer.alloc(10);              // 初始化为 0
const buf2 = Buffer.from('hello', 'utf-8'); // 从字符串创建
const buf3 = Buffer.from([0x68, 0x65, 0x6c]);

// 读写
console.log(buf2.toString());             // 'hello'
console.log(buf2[0]);                     // 104 (0x68)
buf1.write('world', 0, 5, 'utf-8');

// 拼接
const combined = Buffer.concat([buf1, buf2]);

Stream:处理流式数据的抽象接口,避免一次性加载大文件到内存。

四种类型

1. Readable(可读流):读取数据源

const rs = fs.createReadStream('large.txt', { highWaterMark: 64 * 1024 });
rs.on('data', chunk => console.log(chunk.length));
rs.on('end', () => console.log('读取完成'));

2. Writable(可写流):写入目标

const ws = fs.createWriteStream('output.txt');
ws.write('Hello ');
ws.end('World');
ws.on('finish', () => console.log('写入完成'));

3. Duplex(双工流):可读可写(如 TCP socket) 4. Transform(转换流):在读写过程中转换数据(如压缩、加密)

const { Transform } = require('stream');
const upperCase = new Transform({
  transform(chunk, encoding, callback) {
    callback(null, chunk.toString().toUpperCase());
  }
});
readable.pipe(upperCase).pipe(writable);

pipeline

const { pipeline } = require('stream/promises');
await pipeline(readable, transform, writable); // 自动处理错误和清理

对比readFile (全部加载到内存) vs createReadStream (流式逐块读取),后者适合大文件。