node fs 模块使用 File 数据(writeFileSync 和 writeFile)

3,650 阅读1分钟

参考 Node.js v16.11.1 文档 和 mdn 文档


fs.writeFileSync(file, data[, options])fs.writeFile(file, data[, options], callback)

参数

这两个比较简单的写入方法中 data 参数是比较难处理的,data 支持的类型有 string | Buffer | TypedArray | DataView | Object 这几种,下面对这几种类型的 data 分别说明:

string

普通 string 即可

Buffer

Buffer 对象用于表示固定长度的字节序列。 许多 Node.js API 都支持 Buffer。

Buffer 类是 JavaScript Uint8Array 类的子类,Node.js API 在支持 Buffer 的地方也接受普通的 Uint8Array。而所有的 Uint8Array 对象继承自 TypedArray.prototype(换句话说,Uint8Array 是 TypedArray 指代的构造函数之一)。

可以通过 Buffer.from(arrayBuffer[, byteOffset[, length]]) 构造,arrayBuffer 是一个 ArrayBuffer 对象, 可以通过 File.arrayBuffer() 获取(注意 File.arrayBuffer() 返回的是一个 promise,而且这是继承自 Blob 的方法)

TypedArray

一个类型化数组(TypedArray)对象描述了一个底层的二进制数据缓冲区(binary data buffer)的一个类数组视图(view)。

TypedArray 实际是指一类值为特定元素类型的类型化数组构造函数,比如 Int8Array,Uint8Array,Float32Array 等等,而没有一个真的叫 TypedArray 的构造函数。

可以使用 new TypedArray (buffer [, byteOffset [, byteLength]]) 构造,buffer 参数是 ArrayBuffer 对象。

DataView

DataView 视图是一个可以从 二进制ArrayBuffer 对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的字节序问题。

使用 new DataView(buffer [, byteOffset [, byteLength]]) 构造,buffer 参数可以是 ArrayBuffer 或 SharedArrayBuffer(这个还带有实验性质)对象。

Object

必须具有自有的(不是继承的)toString 函数属性。

使用示例(仅片段,如何调用 node 模块不在本例考虑范畴以内)

const {Buffer} = require('buffer')
const fs = require('fs')

const file = new File(["foo"], "foo.txt", {
  type: "text/plain",
})
const rootPath = '保存路径'
file.arrayBuffer()
  .then((fileData) => {
    fs.writeFileSync(rootPath, Buffer.from(fileData))
  })