NodeJS中的“ pipe”方法是什么?

时间:2018-11-03 10:53:06

标签: node.js stream pipe

我看到这种方法在很多情况下都在使用,但我不知道它的作用。

一个例子:

var net = require('net');
var server = net.createServer(function(connection) { 
   console.log('client connected');

   connection.on('end', function() {
      console.log('client disconnected');
   });


   connection.write('Hello World!\r\n');
   connection.pipe(connection);
});

server.listen(8080, function() { 
   console.log('server is listening');
});

connection.pipe(connection);什么时候做?

我在这一行中评论的内容,行为也一样。

另一个例子:

var fs = require("fs");
var zlib = require('zlib');

// Compress the file input.txt to input.txt.gz
fs.createReadStream('input.txt')
   .pipe(zlib.createGzip())
   .pipe(fs.createWriteStream('input.txt.gz'));

console.log("File Compressed.");

有人可以解释管道方法的作用吗?

文档不清晰。预先感谢。

2 个答案:

答案 0 :(得分:1)

.pipe()将可读流馈入可写流,以便随着从可读流中递增地读取内容,它们会自动转发到可写流。它自动为您管理从一个流中读取和写入另一个流中。

在您的第一个示例中:

connection.pipe(connection)

它从TCP连接的传入流中读取数据,并将其写回到传出流中,这实际上将把发送到服务器的任何内容回显给发送者。因此,如果将“ abc”发送到该服务器,您将获得与发送的相同“ abc”作为响应。仅当connection对象既是可读流又是可写流(在这种情况下就是这种情况)时,此方法才起作用。

您的第二个示例:

// Compress the file input.txt to input.txt.gz
fs.createReadStream('input.txt')
   .pipe(zlib.createGzip())
   .pipe(fs.createWriteStream('input.txt.gz'));

input.txt读取,创建一个Gzip流,并将数据从input.txt传递到Gzip流,然后将其传递到文件input.txt.gz中的可写流。下一个结果将是获取input.txt的内容,GZip压缩它们并将其写入input.txt.gz,但这一切都是通过流以增量方式完成的,因此您可以处理非常大的文件而无需读取过多内容一次进入内存。

这些操作涉及的流处理文件的所有缓冲,错误处理和自动关闭。

答案 1 :(得分:0)

pipe通常在流中使用。为什么我们需要流?我能想到的简单示例是处理大文件。假设我们有一个10,000行或更多的文件。无需将所有行加载到内存中(这可能会导致内存限制错误),我们可以在此处使用流来逐行处理和加载行。

fs.createReadStream('input.txt')
   .pipe(zlib.createGzip())
   .pipe(fs.createWriteStream('input.txt.gz'));

这是使用流创建gzip文件的示例。 input.txt的内容通过管道传输到gzip函数,然后通过管道传输到输出文件input.txt.gz

有关流https://github.com/substack/stream-handbook的良好参考

希望有帮助。