Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs-流式可读&;可写误读_Javascript_Node.js_Stream - Fatal编程技术网

Javascript Nodejs-流式可读&;可写误读

Javascript Nodejs-流式可读&;可写误读,javascript,node.js,stream,Javascript,Node.js,Stream,我运行一个节点服务器,并具有以下代码: 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});
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文件(该文件为空),数据是如何到达的


节点中可读写的概念过于简化,我很难理解它们。谢谢您的时间,我想了解一些幕后的情况…

他们的概念相当简单,您在这里似乎有点困惑。流通常是Unix管道,允许您从源读取数据并通过管道将其传输到目标。实际上,每种类型的流都是一个EventEmitter,它实现了一些特定的方法,并根据这些方法将它们划分为不同类型的流,如可写、可读、转换等

关于可写流,来自官方文档

可写流接口是您正在将数据写入的目的地的抽象

关于可读流,来自官方文件:

可读流接口是从
读取的数据源的抽象。换句话说,数据来自可读流

因此,使用可写流,您将数据写入目标,使用可读流,您从源读取数据。我不认为它可以简化得比这更简单,因为我将开始循环使用相同的句子

根据以上内容,我可以回答你的问题

为了接收数据,可写流不应该也是可读的吗

简单地说是否,因为它不会从事件中“接收”数据,正如您所看到的,您正在使用方法
.write(chunk)

来源


Node.js流非常复杂和混乱。我花了大量时间试图理解它们,下面我将尝试传达我的发现

有5种类型,可读、可写、双工、转换和直通

好的,第一个简单的部分:可读写

可读性

  • 要将数据添加到可读流,可以使用.push()函数。当流结束时,您推送(null)
  • 结束时,可读流触发“结束”事件
  • 您可以通过侦听“readable”事件,然后执行“read()”直到返回null,从可读流中读取数据
  • 可读流有一个缓冲区,这意味着当您“push()”到缓冲区时,如果缓冲区已满,则push()将返回false。但是,即使缓冲区已满,也可以继续推送到缓冲区并填充它。“highWaterMark”(或缓冲区大小)实际上是信息性的
  • 可读流实现了一个_read()方法来从非流源中提取数据。然而,你不必使用这个。您可以将此方法留空,然后使用前面描述的push方法。使用您的流的任何人都可以调用read(),这将首先从内部缓冲区读取,然后在缓冲区为空时调用_read()
可写

  • 要向可写流添加数据,请使用.write()函数。流结束后,使用.end()
  • 调用.end()时,它不会立即结束流。它将使用process.nextTick()在下一个滴答声结束流!这给我造成了很多种族状况的心痛
  • 可写流有一个缓冲区。如果缓冲区已满(highWaterMark),则调用.write()时它将返回false。但是,如果需要,您可以继续向其写入并忽略此事件。否则,我认为会有类似于“排水”事件的东西通知您可以继续写作
  • 可写流实现一个_write()方法,将数据发送到一些后端非流接收器。如果此方法返回false,则可写流将开始缓冲数据,并且在“drain”之前不会再次调用_write()
同时使用可读写流

  • 您只能通过管道将一个可读流传输到一个可写流。这可能会让您感到困惑,因为您可能看到类似“streamA.pipe(streamB.pipe(streamC)”的语法。。。事实上,本例中唯一可读的流是streamA。唯一可写的流是streamC。streamB(以及介于两者之间的任何其他流)是一种特殊类型的流,称为变换流
  • 关键点1:不能通过管道传输到可读流。一切都必须从可读的流开始
  • 关键点2:您不能通过管道将可写流传输到任何其他内容。一个可写流就是它的终点。数据必须通过_writemethod()退出可写流
让流通过管道相互连接的唯一方法是使用变换流。到目前为止和我在一起?这里是它变得非常混乱的地方:双工、转换和直通

双工

  • 双工流是可读写流的组合。当通过管道传输双工流(或从双工流读取)时,它将作为可读流运行。当您通过管道连接到双工流时,它的操作方式与可写流完全相同。