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事件,表示缓存区被填满后,操作系统缓存区中的数据已全部读出,可以继续向操作系统缓存区中写入新的数据。
读取一个尺寸较大的文件时,操作系统执行以下操作:
- 首先读取该文件中的数据
- 并把输入填入操作系统缓存区,直到填满为止。
- 不断执行吧缓存区中数据写入目标文件,同时读取文件中剩余数据并把数据填入内存的操作,这是控制台中不断显示write方法的执行结果为false(代表操作系统缓存区已满)的情况。
- 待操作系统缓存区中数据已经全部被写入目标文件时,触发一次drain事件,在控制台中输出“操作系统缓存区中的数据已经全部输出”字符串。
- 首先将内存内的数据写入到操作系统缓存区中,然后读取文件中的剩余数据并填入缓存区,一直到填满为止。
- 重复执行步骤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');
})