Node.js Buffer.write() 方法详解与源码分析
作者:后端茶话时间:2026-10-29 03:33:09浏览:527
本文详细介绍Node.js中Buffer.write()方法的用法,包括将指定编码的字符串写入Buffer指定偏移量的操作。文章解析了offset、length和encoding参数的默认值与行为,并通过示例展示写入截断机制。最后深入源码,分析参数兼容性处理、边界检查及hex、utf8、ascii等编码的具体写入逻辑。
Buffer.write() 方法概述与语法
方法概述
该函数用于将给定的字符串按照指定的编码格式写入到Buffer对象的指定偏移位置。
函数执行后返回实际写入的字节数(以八进制字节为单位计算)。
若Buffer剩余空间不足以容纳整个字符串,则仅写入字符串的前部分,剩余内容将被忽略。
语法定义
代码示例
buffer.write(string, [offset], [length], [encoding])
参数说明
string:String类型,表示要写入Buffer的数据内容。 offset:Number类型,可选参数,默认为0,指定数据写入Buffer的起始位置。 length:Number类型,可选参数,默认为 buffer.length - offset,指定要写入数据的字节长度。 encoding:String类型,可选参数,指定使用的字符编码格式,默认为 'utf8'。
使用示例与源码实现分析
使用示例
代码示例
buf = new Buffer(256);
len = buf.write('\u00bd + \u00bc = \u00be', 0);
console.log(len + " bytes: " + buf.toString('utf8', 0, len));
源码实现
代码示例
Buffer.prototype.write = function(string, offset, length, encoding) {
// 允许调用形式为 write(string, encoding)
if (util.isString(offset) && util.isUndefined(length)) {
encoding = offset;
offset = 0;
// 允许调用形式为 write(string, offset[, length], encoding)
} else if (isFinite(offset)) {
offset = ~~offset;
if (isFinite(length)) {
length = ~~length;
} else {
encoding = length;
length = undefined;
}
// XXX 遗留写法 write(string, encoding, offset, length) - 将在 v0.13 移除
} else {
if (!writeWarned) {
if (process.throwDeprecation)
throw new Error(writeMsg);
else if (process.traceDeprecation)
console.trace(writeMsg);
else
console.error(writeMsg);
writeWarned = true;
}
var swap = encoding;
encoding = offset;
offset = ~~length;
length = swap;
}
var remaining = this.length - offset;
if (util.isUndefined(length) || length > remaining)
length = remaining;
encoding = !!encoding ? (encoding + '').toLowerCase() : 'utf8';
if (string.length > 0 && (length < 0 || offset < 0))
throw new RangeError('attempt to write beyond buffer bounds');
var ret;
switch (encoding) {
case 'hex':
ret = this.hexWrite(string, offset, length);
break;
case 'utf8':
case 'utf-8':
ret = this.utf8Write(string, offset, length);
break;
case 'ascii':
ret = this.asciiWrite(string, offset, length);
break;
case 'binary':
ret = this.binaryWrite(string, offset, length);
break;
case 'base64':
// 警告: base64Write 中未考虑 maxLength
ret = this.base64Write(string, offset, length);
break;
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
ret = this.ucs2Write(string, offset, length);
break;
default:
throw new TypeError('Unknown encoding: ' + encoding);
}
return ret;
};作者最新文章
Node.js中使用path模块获取文件名
2026-11-05 15:15:15
Node.js中url模块与querystring模块处理查询字符串的区别
2026-11-05 15:04:45
JavaScript(JS)主要用来做什么
2026-11-05 10:10:47
怎么修改Node.js和npm的全局安装路径与缓存目录
2026-11-04 19:48:28
NW.js 常见问题排查:Node 模块加载失败与版本兼容解决
2026-11-04 11:22:45
