Skip to content

Buffer 与 Stream · 异步编程

Buffer 缓冲区 · Stream 流 · fs.promises + async/await · http 服务器


一、Buffer 缓冲区

概念

缓冲区(Buffer) 是临时内存,主要由流使用以保留数据直到被消耗。

  • 在 JavaScript 的 Uint8Array 以外引入,用于表示固定长度的字节序列
  • 支持传统编码:ASCII、UTF-8 等
  • 是 V8 之外的固定(不可调整大小)分配的内存
js
// 创建缓冲区
const buf1 = Buffer.alloc(10);        // 分配10字节
const buf2 = Buffer.from('hello');    // 从字符串创建
const buf3 = Buffer.from([0x48, 0x65]); // 从数组创建

console.log(buf2.toString()); // 'hello'

二、Stream 流

StreamsEventEmitter 的实例,用于处理流数据。可处理和操作网络上的流式大文件(视频、mp3 等),使用缓冲区作为临时存储。

四种流类型

类型说明示例
Writable可以写入数据的流fs.createWriteStream()
Readable可以从中读取数据的流fs.createReadStream()
Duplex既可读又可写的流net.Socket
Transform可在写入和读取时修改/转换数据的双工流zlib.createDeflate()

读取流示例

js
const fs = require('fs');
const readStream = fs.createReadStream('large-file.txt');

readStream.on('data', (chunk) => {
  console.log(`收到 ${chunk.length} 字节数据`);
});

readStream.on('end', () => {
  console.log('读取完成');
});

三、Node.js 异步编程

使用 fs.promises + async/await

js
const fs = require('fs').promises;

async function readFile() {
  try {
    const data = await fs.readFile('test.txt', 'utf8');
    console.log(data);
    return data;
  } catch (err) {
    console.error('读取失败:', err);
  }
}

// 并行执行多个异步操作
async function parallelOps() {
  const [result1, result2] = await Promise.all([
    fetch('/api/users'),
    fetch('/api/posts')
  ]);
  return { result1, result2 };
}

四、http 服务器

js
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World');
});

server.listen(3200, () => {
  console.log('Server running at http://localhost:3200/');
});

相关