我看到这种方法在很多情况下都在使用,但我不知道它的作用。
一个例子:
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.");
有人可以解释管道方法的作用吗?
文档不清晰。预先感谢。
答案 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的良好参考
希望有帮助。