node_03 基本模块


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

createReadStream

(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)
    })

(text.text)

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

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


createWriteStream

要以流的形式文件,只需要不断调用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();

(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()

(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()把一个文件流和另一个文件流串起来,这样源文件的所有数据就自动写入到目标文件里了,所以,这实际上是一个复制文件的程序:

(index15.js)

    'use strict'

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

(node.text')

我是node

(text.text')

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

(text.text'):

我是node

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


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

你可能感兴趣的:(node_03 基本模块)