Node.js学习笔记——文件流

使用ReadStream对象读取文件fs.createReadstream(path,[options])

返回一个ReadStream对象。
options为一个对象:
flags:可以采取什么操作
encoding:‘utf8’,‘ascii’,‘base64’
autoClose:布尔值
start:
end:

var fs=require('fs');
var file=fs.createReadStream('./hello.txt',{start:0,end:11,encoding:'utf8'});
file.on('data',function (data) {
    console.log(data);
})
file.on('open',function(data){
    console.log(data);
})
file.on('end',function(data){
    console.log('read over');
})
file.on('close',function(data){
    console.log('read close');
})

ReadStream对象的pause方法可以暂停data事件的触发
可以用resume方法恢复data事件的触发

var fs=require('fs');
var file=fs.createReadStream('./hello.txt',{start:0,end:11,encoding:'utf8'});
file.pause();//暂停了data事件
file.on('data',function (data) {
    console.log(data);
})
file.on('open',function(data){
    console.log(data);
})
file.on('end',function(data){
    console.log('read over');
})
file.on('close',function(data){
    console.log('read close');
})
setTimeout(function () {
    file.resume()
},3000);//恢复data事件

使用WriteStream对象读取文件fs.createWeadstream(path,[options])

返回一个WriteStream对象。

WriteStream有一个write方法,将流数据写入到目标对象中。
  • writable.write(chunk,[encoding],[callback]) //writable代表一个WriteStream对象
  • chunk可以为Buffer对象或字符串,callback中无参数。
  • 该方法返回一个布尔类型的返回值。false表示操作系统缓存区中的数据已满,true表示还可以写入。
WriteStream有一个end方法。

在写入文件的场合中,当没有数据再被写入流中时可调用该方法关闭文件。这将迫使操作系统缓存区中的剩余数据被立即写入文件中

  • writable.end(chunk,[encoding],[callback])
WriteStream有一个bytesWritten属性。已在文件中写入数据的字节数
var fs=require('fs');
var file=fs.createReadStream('./hello.txt');
var out=fs.createWriteStream('./kingsley.txt');
file.on('data',function (data) {
    out.write(data);
})  ///一边读一边写
out.on('open',function (fd) {
    console.log('document opened');
});//被写文件打开了
file.on('end',function () {//读完了
    out.end('bye',function(){
        console.log('all over');//写完 
        console.log('totally %d bytes',out.bytesWritten);

    })
});
drain事件

当操作系统缓存区中的数据已被全部读出并写入到目标文件中,触发WriteStream对象的drain事件,表示缓存区被填满后,操作系统缓存区中的数据已全部读出,可以继续向操作系统缓存区中写入新的数据。

读取一个尺寸较大的文件时,操作系统执行以下操作:

  1. 首先读取该文件中的数据
  2. 并把输入填入操作系统缓存区,直到填满为止。
  3. 不断执行吧缓存区中数据写入目标文件,同时读取文件中剩余数据并把数据填入内存的操作,这是控制台中不断显示write方法的执行结果为false(代表操作系统缓存区已满)的情况。
  4. 待操作系统缓存区中数据已经全部被写入目标文件时,触发一次drain事件,在控制台中输出“操作系统缓存区中的数据已经全部输出”字符串。
  5. 首先将内存内的数据写入到操作系统缓存区中,然后读取文件中的剩余数据并填入缓存区,一直到填满为止。
  6. 重复执行步骤2-4的操作,一直到数据被读取完为止。

ReadStream有一个pipe方法,执行文件的复制操作。

readStream.pipe(destination,[options]);
readStream.unpipe(destination);

  • destination为一个可用于写入流数据的对象,在写文件时为需要被写入的文件的完整路径及文件名。
  • options为对象,有end属性(bool。true则当数据被全部读取完毕时,立即将操作系统缓存区中的剩余数据全部写入文件中并关闭文件。默认为true)
var fs = require('fs');
var file=fs.createReadStream('./hello.txt')
var out = fs.createWriteStream('./kingsley.txt');
file.pipe(out,{end:false});
file.on('end',function () {
    out.end('hello');
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值