我运行节点服务器并拥有以下代码:
var readable = fs.createReadStream(__dirname + '/greet.txt',
{encoding: 'utf8', highWaterMark: 332 * 1024});
greet.txt:
hello
我无法理解可读流和可写流; 在上面的代码中,我有一个可读的流,从greet.txt读取 - 块进入缓冲区,我可以看到二进制数据...问题是, 不应该有一个可写的流将数据发送到另一侧的缓冲区吗?二进制数据如何突然开始飞入我的缓冲区,它只是不清楚。
以下是可读和可写的组合:
var readable = fs.createReadStream(__dirname + '/greet.txt',
{encoding: 'utf8', highWaterMark: 332 * 1024});
var writeable = fs.createWriteStream(__dirname + '/greetcopy.txt');
readable.on('data', function(chunk){
writeable.write(chunk);
});
当一个块到达可读缓冲区,并通过一个事件被发送到可写流的缓冲区时,为了接收数据,可写流也不应该是可读的吗?一旦可写流的缓冲区从可读内容中获取信息并将其发送到greetcopy.txt文件(该文件为空),数据如何到达?
节点中可读写的概念过于简化,我很难抓住它们。感谢您的时间,我想了解幕后发生的事情......
答案 0 :(得分:28)
Node.js流非常复杂且令人困惑。我花了很多时间试图理解它们,我将尝试在下面传达我的发现。
有5种类型,可读,可写,双工,转换和PassThrough。
好的,首先是简单的部分:可读和可写
<强>可读强>
<强>可写强>
一起使用可读和可写的流
让流相互传输的唯一方法是使用 transform 流。和我一起到目前为止?这是令人困惑的地方:Duplex,Transform和PassThrough
<强>双面强>
这两个关键点使得使用Duplex流极为混乱。事实上,我想要一个完全如上所述工作的双向流,所以我创建了自己的here。我把它称为&#39; link-stream&#39;,它实际上并没有使用_read或_write方法。它从streamA获取数据并将其传输到streamC,反之亦然,在全双工模式下,你可以听完&#39;完成&#39;或者&#39;结束&#39;事件,没关系。它是真正的双向直通管道。
<强>变换强>
<强>直通强>
所以你有它。我真的希望Joyent人员能够清理Duplex并减少混乱,我真的希望他们添加双向PassThrough,所以我不必使用我上面描述的链路流方法
祝你好运!
答案 1 :(得分:0)
他们的概念相当简单,看起来你在这里有点困惑。流通常是Unix管道,允许您从源读取数据并将其传送到目标。实际上,每种类型的Stream都是一个 EventEmitter ,它实现了一些特定的方法,并根据这些方法将它们划分为不同类型的Streams,例如 Writable,Readable,Transform 等。
关于 可写流 ,请参阅官方文档here
可写流界面是 目标 的抽象,您将数据 写入 。
关于 可读流 ,请参阅官方文档here:
可读流界面是您从 中读取 的 源 数据的抽象。换句话说,数据来自可读流。
因此,使用 Writable 流,您可以将数据写入目标,并使用可读流从源读取数据。我不相信它可以简化得更多,因为我将开始围绕相同的句子传播。
基于上述问题的答案
为了接收数据,可写流是否也不应该是可读的?
根本就没有,因为它没有“接收”事件中的数据,因为您看到使用的方法是.write(chunk);
来源