对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效果图示
data

open

说明:文件打开后触发的事件

代码演示

	// 导入fs模块并创建文件流之后
	fs.on('open',()=>console.log('文件被打开了'))

cmd效果演示

open

error

说明:当读取文件出错时才触发的事件

代码演示

	// 导入fs模块
	const fs = require('fs')
	const rs = fs.createReadStream('/test.txt')
	rs.on('error',()=>console.log('文件读取异常'))

cmd效果图示

error

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效果图示
pause

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效果图示

resume

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效果图示
write

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效果图示

end
end

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中
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值