1. 读写文件 #

node把读写的文件视为一个整体,为其分配缓存区并一次性将文件内容读取到缓存区中,在此之间node不能做任何工作。 如果文件特别大很容易带来内存溢出的问题

var http = require('http');
var fs = require('fs');
var server = http.createServer(function (req, res) {
    fs.readFile('./data.txt', function (err, data) {
        res.end(data);
    });
});
server.listen(8080);

2. 流 #

在有些时候我们并不关心文件内容,只是关注是否读到数据,以及读到数据时的处理,此时可以用流
流是一组有序的,有起点和终点的字节数据传输手段
网络中传输数据时,总是先将对象包含的数据转成流数据也就是字节数据,再通过流的传输,到达目的地时再转换为原始的数据

2.1 可读流 #

2.1.1 stream.Readable #

用了stream.Readable接口的对象来将对象数据读取为流数据

2.1.2 触发的事件 #

readable可以从流中读取数据时触发。如果指定了回调函数,将迫使操作系统先读入缓存区,再从缓存区中读取数据 当缓存区中的对象全部读出时,且可以继续读取数据时,触发一个新的readable事件

2.1.3 读流的方法 #

2.2 可写流 #

2.2.1 stream.Writable #

2.2.2 事件 #

2.2.3 方法 #

3. createReadStream #

使用readstream对象读取文件

流动模式

var file = fs.createReadStream('./msg.txt',{start:3,end:11});//要注意end是包括这个位置的,
file.on('open',function(){
    console.log('文件打开了');
})

file.on('data',function(data){
    console.log('数据拿到了'+data.length);
})
file.on('end',function(){
    console.log('全部读取完毕');
})

file.on('close',function(){
    console.log('文件关闭了');
})

file.on('error',function(err){
    console.log('出错了'+err);
})

//使用pause方法暂停data事件的触发,这个意味着停止文件的读取,而已经被读取到操作系统缓存区中的数据也将被
//保存在操作系统缓存区。

var readStream = fs.createReadStream('./msg.txt');
readStream.pause();
readStream.on('data',function(data){
    console.log(data);
})
setTimeout(function(){
    readStream.resume();
},5000)

非流动式读取

var rs = fs.createReadStream('./128.txt');//要注意end是包括这个位置的,
var arr = [];
rs.on('readable',function(){
    var data;
    while(null != (data = rs.read())){
        //console.log('read:%d',data.length);
        arr.push(data);
    }
}).on('end',function(){
    var b = Buffer.concat(arr);
    //console.log(b.toString());
})

4. writeStream #

使用writeStream对象写入文件,可以创建一个将流数据写入文件中的writestream对象

writeable.end(chunk,[encoding],[callback]) writeStream还有一个byteswritten属性,表示已经在文件中写入的数据的字节数

var fs = require('fs');
var src = fs.createReadStream('./msg.txt');
var desc = fs.createWriteStream('./anotherMsg.txt');
desc.on('open',function(){
    console.log('需要写入的文件已经被打开');
});
src.on('data',function(data){
    desc.write(data);
})

src.on('end',function(){
    desc.end('再见',function(){
        console.log('文件全部写入完毕');
        console.log('共写入%d字节数据',desc.bytesWritten);
    });
})
var stream = require('stream');
var util = require('util');
var fs= require('fs');
//构建一个自定义的读流
function ZfReadStream(){
    stream.Readable.call(this);
}
util.inherits(ZfRadStream,stream.Readable);
//实现_read方法
ZfRadStream.prototype._read = function(){
    var content = fs.readFileSync('./qqq.txt')
    this.push(content);
    this.push(null);//表示结束
}

function Zf1RadStream(){
    stream.Readable.call(this);
}
util.inherits(Zf1RadStream,stream.Readable);

Zf1RadStream.prototype._read = function(){
    var content = fs.readFileSync('./qqq.txt')
    this.push(content);
    this.push(null);
}

var zfRadStream = new ZfRadStream();
zfRadStream.on('data',function(data){
    fs.writeFile('./ttt.jpg',data);
}).on('end',function(){
    console.log('end');
});
var stream = require('stream');
var util = require('util');
var fs= require('fs');
//自定义的写流
function ZfWriteStream(){
    stream.Writable.call(this);
}
util.inherits(ZfWriteStream,stream.Writable);

ZfWriteStream.prototype._write = function(data,encoding,callback){
 console.log('zf1'+data.toString('utf8'));
    callback();
}

function Zf2WriteStream(){
    stream.Writable.call(this);
}
util.inherits(Zf2WriteStream,stream.Writable);
Zf2WriteStream.prototype = new stream.Writable();
Zf2WriteStream.prototype._write = function(data,encoding,callback){
    console.log('zf2'+data.toString('utf8'));
    callback();
}

var zfWriteStream = new ZfWriteStream();
zfWriteStream.write(new Buffer('珠峰'),function(){
    console.log('写入成功');
});
var zf2WriteStream = new Zf2WriteStream();
zf2WriteStream.write(new Buffer('珠峰'),function(){
    console.log('写入成功');
});
/**
 *双工流,能读能写
 */

var Duplex = require('stream').Duplex;
var util = require('util');
var fs = require('fs');
function Change(){
    Duplex.call(this);
}
util.inherits(Change,Duplex);
Change.prototype._read = function(){

}

Change.prototype._write = function(data,encoding,cb){
    for(var i=0;i<data.length;i++){
        data[i] = 255-data[i];
    }
    this.push(data);
    this.push(null);
}

var c = new Change();
fs.createReadStream('./qqqt.txt').pipe(c)
    .pipe(fs.createWriteStream('qqqtt.txt'));
/**
 * Stream.Transform
 */
var Transform = require('stream').Transform;
var util = require('util');
var fs = require('fs');
function Tran(){
    Transform.call(this);
}
util.inherits(Tran,Transform);
Tran.prototype._transform = function(chunk, encoding, cb){
    console.log(chunk);
    for(var i=0;i<chunk.length;i++){
        chunk[i] = 255-chunk[i];
    }
    this.push(chunk);
    this.push(null);
}
var c = new Tran();
fs.createReadStream('./qqq2.txt').pipe(c)
    .pipe(fs.createWriteStream('qqq3.txt'));