Node.js 文件系统与流的内核:直接操作文件描述符与零拷贝
超越 fs.readFile 与 fs.createReadStream,深入文件描述符 (fd)、低级 I/O 以及基于 Buffer 的零拷贝流实现。 · 难度:入门 · +10XP
文件描述符与低级 I/O
fs.open 返回一个整数文件描述符 (fd),允许你直接控制读/写位置。结合 fs.read 与 fs.write 的 position 参数,可以不必依赖流或缓冲区拼接,实现精确的随机访问。再配合 Buffer.allocUnsafe 与 TypedArray,你可以手动管理内存分配,避免不必要的复制。本教程将指导你构建一个基于 fd 的“零拷贝”日志切割器,当大文件写入时,通过 splice 或 copyFileRange (Linux 原生) 在内核空间完成数据搬移,而不经过用户态内存。
const fs = require('fs');
const { Buffer } = require('buffer');
const srcFd = fs.openSync('source.bin', 'r');
const dstFd = fs.openSync('dest.bin', 'w');
const buf = Buffer.allocUnsafe(16384);
let bytesRead;
while ((bytesRead = fs.readSync(srcFd, buf, 0, 16384, null)) !== 0) {
fs.writeSync(dstFd, buf, 0, bytesRead, null);
}
fs.closeSync(srcFd);
fs.closeSync(dstFd);