node_03 基本模块

\color{orange}{stream}
Node.js提供的又一个仅在服务区端可用的模块,目的是支持“流”这种数据结构。
从文件流\color{purple}{读取}文本内容的示例

createReadStream

\color{red}{腳本}(index13.js)

    'use strit'

    var fs = require('fs');
    //打開一個流
    var rs  = fs.createReadStream('text.text','utf-8');

    rs.on('data',function(chunk){
        console.log('DATA:')
        console.log(chunk)
    })

    rs.on('end',function(){
        console.log('End')
    })

    rs.on('error',function(err){
        console.log('ERROR'+err)
    })

\color{red}{腳本}(text.text)

使用Stream寫入二進制數據
index4.png

要注意,data事件可能会有多次,每次传递的chunk是流的一部分数据。


createWriteStream

要以流的形式\color{purple}{写入}文件,只需要不断调用write()方法,最后以end()结束:

    'use strict';

    var fs = require('fs');

    var ws1 = fs.createWriteStream('text.text', 'utf-8');

    ws1.write('使用Stream寫入文本數據...\n');
    ws1.write('END.');
    ws1.write('END.');
    ws1.end();

\color{red}{腳本}(text.text)直接被改寫為:

index4.png


例子2:

    'use strict';

    var fs = require('fs');

    var ws1 = fs.createWriteStream('text.text', 'utf-8');

    ws1.write('使用Stream寫入文本數據...\n');
    ws1.write('END.');
    ws1.write('123456789.');
    ws1.end();

    var ws2 = fs.createWriteStream('text.text');
    ws2.write(new Buffer('使用Stream寫入文本數據','utf-8'));
    ws2.write(new Buffer('...\nggg','utf-8'))
    ws2.write(new Buffer('1','utf-8'))
    ws2.end()

\color{red}{腳本}(text.text)直接被改寫為:

index4.png

ws1每個字符串都被ws2得對應長度的字符串一一所,沒有被覆蓋的直接輸出;
可以在ws1一開始定義'utf-8',也可以在輸出的時候加上'utf-8'.


例子3:

    'use strict';

    var fs = require('fs');

    var ws1 = fs.createWriteStream('text.text', 'utf-8');

    ws1.write('使用Stream寫入文本數據...\n');
    ws1.write('END.');
    ws1.write('123456789.');
    ws1.end();

    var ws2 = fs.createWriteStream('text.text');
    ws2.write(new Buffer('使用Stream寫入文本數據','utf-8'));
    ws2.write(new Buffer('...**ggg','utf-8'))
    ws2.write(new Buffer('1','utf-8'))
    ws2.end()
index4.png

轉譯符也被當做2個字節看待。

所有可以读取数据的流都继承自stream.Readable,所有可以写入的流都继承自stream.Writable。


pipe

就像可以把两个水管串成一个更长的水管一样,两个流也可以串起来。一个Readable流和一个Writable流串起来后,所有的数据自动从Readable流进入Writable流,这种操作叫pipe。

在Node.js中,Readable流有一个pipe()方法,就是用来干这件事的。

让我们用pipe()把一个文件流和另一个文件流串起来,这样源文件的所有数据就自动写入到目标文件里了,所以,这实际上是一个复制文件的程序:

\color{red}{腳本}(index15.js)

    'use strict'

    var fs = require('fs');
    var rs = fs.createReadStream('node.text')
    var ws = fs.createWriteStream('text.text')
    rs.pipe(ws)

\color{red}{腳本}(node.text')

我是node

\color{red}{腳本}(text.text')

使用Stream寫入文本數據...**ggg123456789.

\color{red}{運行後} \color{purple}{腳本}(text.text'):

我是node

如果pipe\color{purple}{存在}的文件,文件內容直接被重寫,而pipe\color{purple}{不存在}的文件,則在createWriteStream的路徑下新建一個createReadStream路徑一樣的文件。


默认情况下,当Readable流的数据读取完毕,end事件触发后,将自动关闭Writable流。如果我们不希望自动关闭Writable流,需要传入参数:(剛入門並不是很了解這個實際用途,先筆記下來,有大神的可以回復一下,Thx)
readable.pipe(writable, { end: false });

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 模块化公布自己的模块功能. 其他模块调用另外的模块. 公布方法 如果要输出一个键值对象{},可以利用exports...
    httIsHere阅读 3,505评论 0 0
  • 流是Node中最重要的组件和模式之一。在社区里有一句格言说:让一切事务流动起来。这已经足够来描述在Node中流...
    宫若石阅读 3,674评论 0 0
  • Node.js Stream(流) Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对h...
    FTOLsXD阅读 3,813评论 0 2
  • 1 今天我订购并且收到我的2016年全年坚持时间管理,打卡365天的习惯养成的奖励:一个可以计时的手环,很开心!我...
    LiHongxi阅读 1,288评论 0 0
  • //联系人:石虎QQ: 1224614774昵称:嗡嘛呢叭咪哄 1.获取所有本地化语言标示符[NSLocale a...
    石虎132阅读 5,677评论 0 7

友情链接更多精彩内容