Appearance
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 流
Streams 是 EventEmitter 的实例,用于处理流数据。可处理和操作网络上的流式大文件(视频、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/');
});