Stream是一个抽象接口,Node中有很多对象实现了这个接口。例如,对http服务器发起请求的request对象就是一个Stream,还有stdout(标准输出)。
Node.js,Stream有四种流类型:
- Readable--可读操作。
- Writable--可写操作。
- Duplex--可读可写操作。
- Transform--操作被写入数据,然后读出结果。
所有的Stream对象都是EventEmitter的实列。常用的事件有:
- data--当有数据可读时触发。
- end--没有更多的数据可读时触发。
- error--在接收和写入过程中发生错误时触发。
- finish--所有数据已被写入到底层系统时触发。
1、Readable
可读流的例子包括:
- HTTP responses, on the client
- HTTP requests, on the server
- fs read streams
- zlib streams
- crypto streams
- TCP sockets
- child process stdout and stderr
process.stdin
以fs为例创建一个可读流:
fs.createReadStream(path,[options]);
- path --- 要读取文件的路径
- options --- 一个数组对象包含:
flags:指定用什么模式打开,“w”代表写,“r”代表读。
endoding:编码格式“utf8","ascii","base64"三种格式,默认“utf8”。
highWaterMark:水位线
autoClose:为true时(默认行为),对错误或结束的文件描述符将自动关闭,为 false时,文件描述符将不会被关闭,即使他们报错了。
start:开始读取的字节位置
end:结束读取的字节位置。
创建一个1.txt文件,内容:asdfasd
同一目录下创建一个js文件
let fs = require("fs");
let path = require("path");
let readable = fs.createReadStream(path.join(__dirname,"./1.txt"),{flags: 'r',encoding: 'utf8',autoClose: true,mode: "0666",
});
readable.on('data', function(chunk){console.log( chunk.length, chunk);
});
//7 'asdfasd'
可读的流有两种模式:
流动模式:数据会自动从来源流出,直到来源数据耗尽。
暂停模式:你得通过stream.read()主动去要数据,不要数据就一直等在那。
可读流在创建时都是暂停模式。暂停模式和流动模式可以相互转换。
2、Writable
可写流的例子包括了:
- HTTP requests, on the client
- HTTP responses, on the server
- fs write streams
- zlib streams
- crypto streams
- TCP sockets
- child process stdin
process.stdout
,process.stderr
例如:
let fs = require("fs");
let path = require("path");
let writable = fs.createWriteStream(path.join(__dirname,"./1.txt"),{flags: 'w',encoding: 'utf8',autoClose: true,mode: "0666",
});
writable.on('finish', function(){console.log('写入完成');process.exit(0);
});
writable.write('node修炼中...', 'utf8');
writable.end();
//写入完成
3、Duplex
Duplex 流的实例包括了:
- TCP sockets
- zlib streams
- crypto streams
4、Transform
变换流的实例包括:
- zlib streams
- crypto streams