Node学习第二天
文件流
说明:内存数据与磁盘文件数据之间的流动
什么是流
说明:流是指
数据的流动
,数据从一个地方缓慢的流动到另一个地方的过程就是流
流的分类
说明:流是有一定的
方向流动
的由不同的方向流动有不同的说法
可读流(Readable)
说明:数据从
源头流向内存
,这一块是可以读取的
可写流(Writable)
说明:数据从
内存流向源头
,这一块是用于存储的
双工流
说明:数据
从源头流向内存
和由内存流向源头
这两个流动同时进行的过程就可以称为双工流
为什么要流
说明:一般而言,内存的空间往往要比磁盘的空间小很多,而这样如果直接读取磁盘文件可能会读取不了,此时如果以
流的形式
读取磁盘文件会减少很多内存读文件的压力
文件流的创建
fs.createReadStream()
说明:创建一个文件的
可读流
,用于读取文件的内容,该方法会返回Reasable的子类ReadStream
参数
说明:可传入两个参数,第一个参数是读文件的
路径
,第二个参数是读文件的可选
操作,比如一次读多少(highWaterMark
),以什么格式读取(encoding
)…等等
创建一个可读流
代码演示
// 导入fs模块
const fs = require('fs')
const rs = fs.createReadStream(url,{
highWaterMark: 5, // 每次读5个字符的内容
encoding: 'utf8' // 有设置值时表示字符数,默认是表示字节数
})
事件
说明:通过on去监听读取文件做的事,传入两个参数,第一个参数是字符串形式的
事件名
,第二个参数是触发事件后做出的回调函数
data
说明:当读取到一部分文件后触发的事件(只有当注册了data事件,读文件才算真正开始读取)
代码演示
// 在导入了模块信息
const fs = require('fs')
const rs = fs.createReadStream('./test.txt',{
highWaterMark: 5,
encoding: 'utf8'
})
rs.on('data', data=>console.log(data))
注:
一个中文三个字符,第一次读取满足数量后如果超出会留给下一次继续接着读取
cmd效果图示
open
说明:文件打开后触发的事件
代码演示
// 导入fs模块并创建文件流之后
fs.on('open',()=>console.log('文件被打开了'))
cmd效果演示
error
说明:当读取文件出错时才触发的事件
代码演示
// 导入fs模块
const fs = require('fs')
const rs = fs.createReadStream('/test.txt')
rs.on('error',()=>console.log('文件读取异常'))
cmd效果图示
close
说明:文件关闭时触发的事件
代码演示
// 导入fs模块
const fs = require('fs')
const rs = fs.createReadStream('./test.txt')
rs.on('close',()=>console.log('文件关闭了'))
end
说明:当文件的所有数据读取完之后才触发的事件
方法演示
// 导入fs模块
const fs = require('fs')
const rs = fs.createReadStream('./test.txt')
rs.on('end',()=>console.log('文件读取结束'))
rs.pause()
说明:暂停读取,可用于读到某一个位置时暂停对文件的读取操作
方法演示
// 导入fs模块
const fs = require('fs')
const rs = fs.createReadStream('./test.txt',{highWaterMark:3})
rs.on('data',chunk=>{
console.log(chunk)
console.log('文件读取暂停')
rs.pause()
})
cmd效果图示
rs.resume()
说明:恢复对文件的读取操作,与pause方法相对应,当调用pause时也会有触发pause的事件此时可以再恢复对文件的继续读取
方法演示
//导入fs模块
const fs = require('fs')
const rs = fs.createReadStream('./test.txt',{highWaterMark:3})
rs.on('data',chunk=>{
console.log(chunk)
console.log('文件暂停读取了')
rs.pause()
})
rs.on('pause',()=>{
console.log('文件恢复读取')
rs.resume()
})
cmd效果图示
fs.createWriteStream()
参数
说明:与读文件流的参数差不多类似,但一般在写文件时会多一个参数flags表示写入的内容是否覆盖之前的,默认为覆盖,若设置值为’a’表示追加当前文件的内容
返回值
说明:创建一个可写流,并返回Writeable的子类WriteStream
方法演示
//导入fs模块
const fs = require('fs')
const ws = fs.createWriteStream('./test.txt',{
highWaterMark: 3, 一次最多写入3个字符数
encoding: 'utf8' // 以utf8的格式写入
flags: 'a' //追加内容不覆盖
})
事件
说明:监听可写流也是通过on事件监听其状态
open
说明:当写入的文件被打开时触发的事件
方法演示
// 导入fs模块
const fs = require('fs')
const ws = fs.createWriteStream('./test.txt',{flags:'a'})
ws.on('open',()=>console.log('写入的文件打开了'))
error
说明:当写入文件时出现异常触发的事件
方法演示
// 导入fs模块
const fs = require('fs')
const ws = fs.createWriteStream('./test.txt',{flags:'a'})
ws.on('error',()=>console.log('写入异常'))
close
说明:当写入文件之后自动关闭时触发的事件
方法演示
// 导入fs模块
const fs = require('fs')
const ws = fs.createWriteStream('./test.txt',{flags:'a'})
ws.on('close',()=>console.log('写入已完成'))
ws.write()
说明:当调用该事件才是对文件写入的真正开始,调用一次写入一次,写入成功会返回一个布尔值
代码演示
// 导入fs模块
const fs = require('fs')
const ws = fs.createWriteStream('./test.txt',{flags:'a'})
const flag = ws.write('第一次写入')
console.log('第一次写入',flag)
const flag2 = ws.write('第二次写入')
console.log('第二次写入',flag2)
//输出写入的内容
fs.createReadStream('./test.txt').on('data',chunk=>console.log(chunk))
cmd效果图示
ws.end()
说明:调用该方法是对最后一次写入的操作
方法演示
// 导入fs模块
const fs = require('fs')
const ws = fs.createWriteStream('./test.txt',{flags:'a'})
const flag = ws.end('最后一次写入操作')
console.log('最后一次',flag) // 返回写入对象
const flag2 = ws.write('尝试再次添加')
console.log('尝试',flag2) // 报错 false
cmd效果图示
rs.pipe(ws)
说明:对文件的读取与写入同时进行,可以解决背压问题
方法演示
// 导入fs模块
const fs = require('fs')
const rs = fs.createReadStream('./test.txt')
const ws = fs.createWriteStream('./test2.txt',{flags:'a'})
rs.pipe(ws)//将test的内容写入test2中