Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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
如何从从从字符串而不是从文件(Node.js)获得的流中获取块_Node.js - Fatal编程技术网

如何从从从字符串而不是从文件(Node.js)获得的流中获取块

如何从从从字符串而不是从文件(Node.js)获得的流中获取块,node.js,Node.js,在对文件使用Node.js中的fs.createReadStream方法时,我会得到一个可读的流,在该流上会发出一个“data”事件。因此,稍后我可以调用myReadableStream.on('data',(chunk)=>{…}),在这里我可以获取流的块,这样就不会使内存过热。问题是,当从字符串而不是从文件创建流时,如何将流拆分为块?现在,我有一个字符串,我使用require('stream')将其转换为可读对象。可读,但当我调用('data')时,我只得到1个块(我假设转换为可读流的字符串

在对文件使用Node.js中的fs.createReadStream方法时,我会得到一个可读的流,在该流上会发出一个“data”事件。因此,稍后我可以调用myReadableStream.on('data',(chunk)=>{…}),在这里我可以获取流的块,这样就不会使内存过热。问题是,当从字符串而不是从文件创建流时,如何将流拆分为块?现在,我有一个字符串,我使用require('stream')将其转换为可读对象。可读,但当我调用('data')时,我只得到1个块(我假设转换为可读流的字符串上没有发出“data”事件,不是吗?)。从文件派生的流和从字符串派生的流的值是相同的(相同的长度),因此我希望将其很好地分割为几个块,以加快数据处理。有人能帮忙吗?

我想我已经回答了我的问题

要读取文件,我使用

fs.createReadStream(path[, options])
方法返回新的ReadStream对象()

Node.js中有4种类型的流(可读、可写、双工和转换)()。可读和可写流都将数据存储在内部缓冲区中。潜在缓冲的数据量取决于传递到streams构造函数的highWaterMark选项

对于普通流(从字符串或缓冲区对象构建的流),highWaterMark选项指定总字节数。对于以对象模式运行的流(那些构建在Javascript对象上的流),highWaterMark指定对象的总数

从中可以看到,highWaterMark值默认为16384字节(或16 KB)(对于对象模式下的流,为16个对象),从方法中可以看出这一点

与为可读流(16 kb)上的highWaterMark设置的默认值不同,此方法返回的流对于同一参数具有64 kb的默认值

因此,默认情况下,fs.createReadStream(path[,options]方法返回的ReadStream对象的highWaterMark设置为65536字节(64 KB)

现在我可以检查我的代码了。我存储到文件中的字符串大小是7372801字节。当我使用fs.createReadStream(path[,options]方法读取此文件时,我会得到113个块:

// To get a ReadStream object
fs.open(path, 'r', (err, fd) => { // fd - file descriptor
   if (err) {
      if (err.code === 'ENOENT') {
         // path points to nowhere - file does not exist
      }
      throw err
   }

      var rStream = fs.createReadStream(path, {fd: fd})
})
顺便说一下,在这里读取文件时,我使用文件描述符。从文档:

如果指定了fd,ReadStream将忽略path参数并使用指定的文件描述符。这意味着不会发出“打开”事件。请注意,fd应该是阻塞的;非阻塞的fd应该传递给net.Socket

这是因为7372801/65538(64KB)=112+余数=>113 当我人工将字符串转换为流时(您可以在文档中的Implementing streams部分找到如何实现该操作的信息,在我的示例中,我创建了一个单独的类):

上面的流还提供了113个块,因为我将highWaterMark选项重新设置为64KB

在Node.js中,要获取字符串中的字节数,可以使用method.Encoding默认为“utf8”

要从可读流中获取缓冲区,可以使用

rStream._readableState.buffer
从可写流->

wStream._writableState.getBuffer()
因此,现在使用highWaterMark选项,我可以管理块

rStream._readableState.buffer
wStream._writableState.getBuffer()