澳门新莆京手机网站-新蒲京娱乐场 > 联系我们 > Node中流的概念

Node中流的概念

描述

Transform Stream 调换数据流,可读可写,同有时候可以转移数据

有了双工流,大家能够在同贰个对象上还要落到实处可读和可写,就象是同一时候继续那多少个接口。 首要的是双工流的可读性和可写性操作完全部独用立于相互。那无非是将三个特征组合成三个对象。

事件名

event-stream 用起来有函数式编制程序的以为到,个人相比赏识

流是黄金年代组有序的,有源点和终点的字节数据传输花招
它不爱戴文件的一体化内容,只关心是还是不是从文件中读到了多少,以致读到数据未来的拍卖
流是三个虚幻接口,被 Node 中的相当多对象所完成。比方HTTP 服务器request和response对象都以流。
流中的数码有三种模式,二进制情势和指标方式

方法名

pipe 作为 pipe 目的时接触

var ws = fs.createWriteStream(path,[options]);
path写入的文本路线
options
flags张开文件要做的操作,默感觉'w'
encoding默认为utf8
highWaterMark写入缓存区的暗中同意大小16kb
2.2 write方法

read用于读取数据setEncoding用于内定用怎么样编码格局读取数据pause用于通告对象停止触发data事件resume用于文告对象恢复生机触发data事件pipe用于安装二个数据通道,然后抽出全数流数据并将其出口到大路另风度翩翩端所针没错靶子对象中unpipe用于废除pipe设置的坦途

不真实 pipe 方法的目标地时,调用 pause 方法

var rs = fs.createReadStream(path,[options]);
path读取文件的不二等秘书籍
options
flags打开文件要做的操作,默以为'r'
encoding默认为null
start开始读取的目录地方
end甘休读取的目录地点(蕴涵截止地点卡塔尔(قطر‎
highWater马克读取缓存区暗中同意的深浅64kb
(备注:要是钦定utf8编码highWaterMark要大于3个字节)

那些目的将有十分大希望接触的平地风波如下表所示:

特点

module.exports = WriteStream;
2.可写流createWriteStream

const fs = require('fs');let file = fs.createReadStream('./data.txt');// console.log(file); //得到的是一个ReadStream对象//对象在读取文件时,需要先打开文件,打开文件会触发open事件file.on('open',function(fd){ console.log('开始读取文件'); // console.log(fd);});//对象触发data事件,读取数据file.on('data',function(data){ console.log('读取到数据'); console.log(data.toString());});//读取文件完毕,触发end事件file.on('end',function(){ console.log('文件读取完毕');});//关闭文件,触发close事件file.on('close',function(){ console.log('关闭文件')});file.on('error',function(err){ console.log(err)});

fs.readFile 对于每一种 Node.js 使用者来讲最熟练然而了,轻便易懂,很好上手。但它的缺欠是会先将数据总体读入内部存款和储蓄器,少年老成旦遇见大文件的时候,这种方式读取的频率就充足低下了。

read() {
    if (typeof this.fd != 'number') {
        return this.once('open', () => this.read());
    }
    let n = this.end ? Math.min(this.end - this.pos, this.highWaterMark) : this.highWaterMark;
    fs.read(this.fd,this.buffer,0,n,this.pos,(err,bytesRead)=>{
        if(err){
         return;
        }
        if(bytesRead){
            let data = this.buffer.slice(0,bytesRead);
            data = this.encoding?data.toString(this.encoding):data;
            this.emit('data',data);
            this.pos += bytesRead;
            if(this.end && this.pos > this.end){
              return this.emit('end');
            }
            if(this.flowing)
                this.read();
        }else{
            this.emit('end');
        }
    })
}

open() {
    fs.open(this.path, this.flags, this.mode, (err, fd) => {
        if (err) return this.emit('error', err);
        this.fd = fd;
        this.emit('open', fd);
    })
}


end() {
    if (this.autoClose) {
        this.destroy();
    }
}

destroy() {
    fs.close(this.fd, () => {
        this.emit('close');
    })
}

drain当用于写入数据的write方法重返false之后触发finish当end方法被调用且数量被全部写入操作系统缓存区时触发pipe当用于读取数据的pipe方法被调用时触发unpipe当用于读取数据的pipe方法被调用时触发error当写入数据的长河中生出错误时接触

error 写入数据产生错误时接触

let fs = require('fs');
let ReadStream = require('./ReadStream');
let rs = ReadStream('./1.txt', {
flags: 'r',
encoding: 'utf8',
start: 3,
end: 7,
highWaterMark: 3
});
rs.on('open', function () {
console.log("open");
});
rs.on('data', function (data) {
console.log(data);
});
rs.on('end', function () {
console.log("end");
});
rs.on('close', function () {
console.log("close");
});
/**
open
456
789
end
close
**/
let fs = require('fs');
let EventEmitter = require('events');

描述

常用类库

该事件会在读完数据后被触发

readable当能够从流中读取数据时触发data当读取到来自文件,顾客端,服务器端等对象的新的数额时触发end代表八个socket端口对象child.stdout当读取完全数的风浪时接触,该事件的触发意味着data事件将不再被触发err当读取数据的历程中发生错误时触发close当用于读取数据的目的被关闭时接触,并不是全体用于读取流数据的靶子都会触发该事件

已结束/关闭的流不可能重复使用,必需重新创建数据流

与内定{encoding:'utf8'}效果等同,设置编码

对象

可写数据流的风浪

1.1创立可读流

从流的定义中大家可见流是用来传输流数据的,也正是说我们须求把其余的目的数据转载为流多少。在Node中,使用了种种实现了stream.Readable接口的靶子读取流。约等于说只有这么些目的技术够读取流Node.js中能够读取数据流的靶子,列表如下:

close 数据源关闭时接触

二进制方式, 每种分块都是buffer或许string对象.
对象格局, 流内处的是大器晚成雨后春笋普通对象.
(备注:全部应用 Node.js API 创制的流对象都只好操作 strings 和 Buffer对象。可是,通过一些第三方流的完成,你如故能够管理其余品类的 JavaScript 值 (除了 null,它在流管理中有特殊意义卡塔尔国。 这么些流被感到是干活在 “对象格局”(object mode)。 在创造流的实例时,能够通过 objectMode 选项使流的实例切换来目的方式。试图将曾经存在的流切换来对象格局是不安全的。)

二.能够使用流的目的

主干介绍

2.4 drain方法

接下去使用fs模块中的createReadStream方法创设贰个将文件读取为流数据的ReadStream对象,介绍一下流数据的读取。示例代码如下:

data

2.3 end方法

那么些目的在写入数据的进度中,所拥有的秘籍如下表所示:

调用 resume 方法

}
parseHeader(rs,function(err,header,stream){
console.log(header);
stream.setEncoding('utf8');
stream.on('data',function (data) {
console.log('data',data);
});
});
Host: www.baidu.com
User-Agent: curl/7.53.0
Accept: /

const fs = require('fs');let file = fs.createWriteStream('./result.txt');file.write('hello Node.js',function(){ console.log('写入文件')})

readable 数据向外流时接触

}

描述

而 fs.createReadStream 则是经过 Stream 来读取数据,它会把文件分割成小块,然后触发一些特定的事件,大家得以监听那些事件,编写特定的管理函数。这种措施相对上边来讲,并糟糕上手,但它功能极其高。

1.可读流createReadStream

地点介绍了Node.js中用来读取流的对象,以至在读取进度中,对象恐怕接触的风云以致调用的办法。上面介绍Node.js中用于写入流的靶子,以至在写入进程中,那一个目的或然接触的事件和调用的法门。

data 对于这多少个未有显式暂停的数据流,增多data事件监听函数,会将数据流切换成流动态,尽快向外提供数据

在调用了 stream.end(卡塔尔 方法,且缓冲区数据都早就传给底层系统以后, 'finish' 事件将被触发。

地方那些读取数据的靶子将会接触的事件

finish 调用 .end 方法时,全体缓存的数码释放后触发,相同于可读数据流中的 end 事件,表示写入进程停止

function parseHeader(stream, callback) {
let header = '';
rs.on('readable',onReadable);
function onReadable() {

描述

注意:只移除 data 事件的监听函数,并不会自行引发多少流踏向「暂停态」。别的,存在 pipe 方法的目标地时,调用 pause 方法,并无法确认保证数据流总是处于暂停态,风流倜傥旦这个指标地发出数据诉求,数据流有非常大希望会延续提供数据。

ws.write(chunk,[encoding],[callback]);
chunk写入的多少buffer/string
encoding编码格式chunk为字符串时有用,可选
callback 写入成功后的回调
(备注:再次回到值为布尔值,系统缓存区满时为false,未满时为true)

上一篇:没有了 下一篇:没有了

Copyright © 2015-2019 http://www.carrefourstation.com. 澳门新莆京手机网站-新蒲京娱乐场有限公司 版权所有