工作中常常需要写一些小脚本处理事情,比如创建测试文件、处理某个文本等等,之前做测试开发的时候是用 Python 做的,现在写前端,JavaScript 成为主力语言,自然想把这些小脚本用 JavaScript 实现。脚本中常见的工作就是文件读写,因此对 JavaScript 文件读写知识做下强化和总结。
Node
Node 中的文件系统操作被封装在 fs
模块,每个 API 都提供同步和异步两种形式,异步函数 fs.xxx
对应同步函数是 fs.xxxSync
,例如 fs.readFile
对应 fs.readFileSync
。区别主要是同步函数要么返回结果要么抛出异常,而异步函数的参数多了 callback
,用来处理异常或者正常返回的结果。另外,fs.promises
中还提供了基于 Promise
的异步 API。
脚本中用同步 API 更加简洁,以下以同步 API 为例介绍主要操作:
读文件
读文件使用 fs.readFileSync(path[, options])
,它的第一个参数是路径,第二个参数是 encoding
(default: null
) 和 flag
(default: 'r'
) 组成的 options
,如果 encoding
为 null
,则返回 buffer
,否则返回 string
,options
也可以是 string
,这时表示 encoding
。
支持的 encoding
参考 这里,一般用 utf8
就行了。
const fs = require('fs')
// suppose 'xxx' in data.txt
const data = fs.readFileSync('/home/vincent/data.txt', 'utf8')
console.log('data = ', data) // output: data = xxx
复制代码
写文件
写文件使用 fs.writeFileSync(path, data[, options])
,第一个参数是路径,第二个是要写入的内容,第三个是 encoding
(default: 'utf8'
)、mode
(default: 0o666
) 和 flag
(default: w
) 组成的 options
,一般 options
使用默认值即可。
const fs = require('fs')
fs.writeFileSync('/home/vincent/data.txt', 'xxx') // then 'xxx' in data.txt
复制代码
流式读写
如果文件很大,比如数十 GB 的日志文件,全量读写就不合适了。这时候可以使用如下函数操作:
fs.createReadStream(path[, options])
fs.createWriteStream(path[, options])
这两个函数返回 Stream
实例,实例方法参考 这里。
Browser
浏览器环境需要通过 FileReader
API 来读文件内容,主要场景是上传图片前生成预览缩略图、文件内容校验等,示例代码如下:
const input = document.getElementsByTagName('input')[0]
input.addEventListener('change', function() {
const file = this.files[0] // suppose file content is 'xxx'
const reader = new FileReader();
reader.onload = function (e) {
const = data = reader.result
console.log(data) // output: xxx
}
reader.readAsText(file, 'UTF-8')
}, false)
复制代码