// 文件系统模块 负责读写文件
let fs = require('fs')
let log = (...value) => console.log(...value)
// 例 1. 写文件
let ws = fs.createWriteStream('lx.txt', 'utf-8')
// write(写入数据, [格式], [回调])
ws.write('写入第一段文本', 'utf-8', () => {
// 写入完成回调函数
})
ws.write('写入第二段文本')
// end: 调用end 方法以后 后面不允许再用这个ws写入数据 否则报错
ws.end('结束写入. 这里的提示文案参数可选')
// 例 2.
/**
* createReadStream(文件, options): 同步读取流 进程完全阻塞
options: {
highWaterMark: 设置每次读取流的大小 默认最大64K,
start: 设置读文件的开始位置 可以读取某个文件的一部分内容 不用都读取,
end: 设置读文件的结束位置,
encoding: 按什么格式读取文件
}
*/
let rs = fs.createReadStream('m.mp4', {
// start: 0,
// end: 5,
// encoding: 'utf-8'
// 下面设置成 16K
highWaterMark: 1024 * 16
})
// 例 1. 写文件
let ws2 = fs.createWriteStream('m2.mp4', 'utf-8')
// createWriteStream(要写入的文件名): 写入流
// let ws = fs.createWriteStream('m2.mp4')
// 每次读取完成后触发 data事件可能会触发多次
rs.on('data', chunk => {
if ( ws2.write(chunk) === false ) {
// 暂停读文件 指导上一次读取的文件写入完成再继续读文件
rs.pause()
} else {
log('写入完成.')
}
})
// 如果读一个比较大的文件 每次都会读取一部分 然后写入
// drain 监听每次写入是否完成 只有每次写入完成以后才能再触发rs 继续读文件
// 否则没写入完成就继续读文件 然后写入 文件内容会乱掉
ws2.on('drain', () => {
// 继续读文件
rs.resume()
})
// end 全部读取完成后触发事件
rs.on('end', () => {
log('读取完成.')
})
rs.on('error', (err) => {
// 读取错误 触发error 事件
})
// 例 3. pipe
// 读取流
/**
* createReadStream(文件, options): 读取流
options: {
highWaterMark: 设置每次读取流的大小 默认最大64K,
start: 设置读文件的开始位置 可以读取某个文件的一部分内容 不用都读取,
end: 设置读文件的结束位置,
encoding: 按什么格式读取文件
}
*/
let rs3 = fs.createReadStream('m.mp4', {
// start: 0,
// end: 5,
// encoding: 'utf-8'
// 下面设置成 16K
highWaterMark: 1024 * 16
})
// 写入m3.mp4
let ws3 = fs.createWriteStream('m3.mp4')
// pipe: 会自动把读取的流写入到m3.mp4 写入完成后再继续读文件
rs3.pipe(ws3)
// 读完数据 触发 data 事件 可能会触发多次
rs3.on('data', chunk => {
log(chunk)
})
// 全部读完触发 end 事件
rs3.on('end', () => {
log('例3 写入完成.')
})