Node.js 流(Stream)

  • 流是使您可以连续地从源读取数据或将数据写入目标的对象。在Node.js中,有四种类型的流-
    • 可读 -用于读取操作的流。
    • 可写 -用于写操作的流。
    • 双工 -可用于读取和写入操作的流。
    • 转换 -一种双工流,其中基于输入计算输出。
    每种类型的Stream都是一个EventEmitter实例,并在不同的时间实例抛出多个事件。例如,一些常用事件是-
    • data - 当有可读取的数据时,将触发此事件。
    • end - 当没有更多的数据读取此事件被触发。
    • error - 接收或写入数据时发生错误时将触发此事件。
    • finish - 当所有的数据已刷新到底层系统,此事件被触发。
    本教程提供了对Streams上常用操作的基本了解。
  • 从流中读取

    创建一个名为input.txt的文本文件,其内容如下:
    
    abcdefghijklmnopqrstuvwxyz
    
    使用以下代码创建一个名为main.js的js文件-
    
    var fs = require("fs");
    var data = '';
    
    // Create a readable stream
    var readerStream = fs.createReadStream('input.txt');
    
    // Set the encoding to be utf8. 
    readerStream.setEncoding('UTF8');
    
    // Handle stream events --> data, end, and error
    readerStream.on('data', function(chunk) {
       data += chunk;
    });
    
    readerStream.on('end',function() {
       console.log(data);
    });
    
    readerStream.on('error', function(err) {
       console.log(err.stack);
    });
    
    console.log("程序结束");
    
    现在运行main.js以查看结果-
    
    $ node main.js
    
    验证输出。
    
    程序结束
    abcdefghijklmnopqrstuvwxyz
    
  • 写入流

    使用以下代码创建一个名为main.js的js文件-
    
    var fs = require("fs");
    var data = 'Simply Easy Learning';
    
    // Create a writable stream
    var writerStream = fs.createWriteStream('output.txt');
    
    // Write the data to stream with encoding to be utf8
    writerStream.write(data,'UTF8');
    
    // Mark the end of file
    writerStream.end();
    
    // Handle stream events --> finish, and error
    writerStream.on('finish', function() {
       console.log("写入完成.");
    });
    
    writerStream.on('error', function(err) {
       console.log(err.stack);
    });
    
    console.log("程序终止");
    
    现在运行main.js以查看结果-
    
    $ node main.js
    
    验证输出。
    
    程序终止
    写入完成.
    
  • 管道流

    管道是一种机制,其中我们将一个流的输出作为另一流的输入。它通常用于从一个流中获取数据并将该流的输出传递到另一流。管道操作没有限制。现在,我们将展示一个管道示例,该示例用于读取一个文件并将其写入另一个文件。使用以下代码创建一个名为main.js的js文件-
    
    var fs = require("fs");
    
    // Create a readable stream
    var readerStream = fs.createReadStream('input.txt');
    
    // Create a writable stream
    var writerStream = fs.createWriteStream('output.txt');
    
    // Pipe the read and write operations
    // read input.txt and write data to output.txt
    readerStream.pipe(writerStream);
    
    console.log("程序结束");
    
    现在运行main.js以查看结果-
    
    $ node main.js
    
    验证输出。
    
    程序结束 
    
    打开在当前目录中创建的output.txt;它应包含以下内容(您的input中是什么内容,output中就是什么内容)-
    
    abcdefghijklmnopqrstuvwxyz
    
  • 连接流

    链接是一种将一个流的输出连接到另一流并创建多个流操作的链的机制。通常用于管道操作。现在,我们将使用管道和链接来首先压缩文件,然后将其解压缩。使用以下代码创建一个名为main.js的js文件-
    
    var fs = require("fs");
    var zlib = require('zlib');
    
    // 压缩文件 input.txt 到 input.txt.gz
    fs.createReadStream('input.txt')
       .pipe(zlib.createGzip())
       .pipe(fs.createWriteStream('input.txt.gz'));
      
    console.log("压缩文件完成.");
    
    现在运行main.js以查看结果-
    
    $ node main.js
    
    验证输出。
    
    压缩文件完成.
    
    您会发现input.txt已被压缩,并在当前目录中创建了文件input.txt.gz。现在让我们尝试使用以下代码解压缩同一文件-
    
    var fs = require("fs");
    var zlib = require('zlib');
    
    // 解压缩 input.txt.gz 到 input.txt
    fs.createReadStream('input.txt.gz')
       .pipe(zlib.createGunzip())
       .pipe(fs.createWriteStream('input.txt'));
      
    console.log("解压文件完成.");
    
    现在运行main.js以查看结果-
    
    $ node main.js
    
    验证输出。
    
    解压文件完成.