节点 fs.readFileSync 返回一个 uInt8 数组而不是原始缓冲区数组?

Posted

技术标签:

【中文标题】节点 fs.readFileSync 返回一个 uInt8 数组而不是原始缓冲区数组?【英文标题】:Node fs.readFileSync returns a uInt8 array instead of raw buffer array? 【发布时间】:2017-10-01 19:35:48 【问题描述】:

为什么会这样:

var myArrayBuffer = fs.readFileSync(file, null)

返回一个 uInt8 数组而不是一个 arrayBuffer?为什么这似乎有效?

var myArrayBuffer = fs.readFileSync(file, null).buffer;
var myAArray = new Uint16Array( myArrayBuffer.slice(266,(sizeofArray*sizeOfArrayElement));

为什么 fs.readFile 会将我的文件解析为 uInt8 数组?没有意义,该文件有一堆不是 1 字节长的不同数据类型。

【问题讨论】:

【参考方案1】:

因为从 v3.0.0 开始,Buffer 类继承自 Uint8Array 类。引用the doc:

Buffer 实例也是 Uint8Array 实例。但是,与 ECMAScript 2015 中的 TypedArray 规范存在细微的不兼容性。例如,虽然 ArrayBuffer#slice() 创建了切片的副本,但 Buffer#slice() 的实现在现有 Buffer 上创建了一个视图而不复制,从而使 @ 987654330@ 效率更高。 [...]

可以 创建一个新的Buffer,它与 TypedArray 实例使用TypeArray 对象的.buffer 属性。

...这正是您的示例中所做的。

【讨论】:

但是为什么有人需要 uInt8Array?您将文件直接读入缓冲区并处理字节?如果你读入一个二进制文件,那么它全部是 uInt8 的可能性似乎很小,只会增加开销,在我的情况下是混乱和沮丧。 不确定您的意思。是的,Buffer 也是 Uint8Array - 但你不必像以前一样使用它。 我也很困惑;) 缓冲区似乎也不是 uint8Array,因为 uint8Array.slice(266,length) 给了我 Uint8array 索引,所以它的两倍,其中缓冲区切片切片字节。似乎增加了开销 是的,文档中也提到了这一点。在这种情况下,继承也意味着覆盖某些方法的行为。

以上是关于节点 fs.readFileSync 返回一个 uInt8 数组而不是原始缓冲区数组?的主要内容,如果未能解决你的问题,请参考以下文章

fs.readFileSync 总是返回空字符串

如何从节点中的ReadStream同步读取

无法对 fs.readFileSync() 返回的字符串运行 includes() 方法

Node.JS fs.readFileSync() 错误参数

JS:为什么fs.readFileSync()返回缓冲区,即使我之前使用toString()将其转换为字符串?

fs.readFileSync 不是 Meteor 的函数,React