节点 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() 返回的字符串运行 includes() 方法
Node.JS fs.readFileSync() 错误参数