首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs readable.read()返回空

Nodejs readable.read()返回空
EN

Stack Overflow用户
提问于 2017-01-05 05:59:17
回答 4查看 5.5K关注 0票数 10

我想从文件中读取字节,下面是示例代码:

代码语言:javascript
复制
var fs = require('fs');

var stream= fs.createReadStream('./lib');
console.log(stream.read(10));

返回空。

我认为这是因为read()方法直接从内部缓冲区获取数据。如果缓冲区没有足够的数据,则返回nullread()方法是一个同步调用,不传递回调,因此设计是有意义的。但是,我不知道内部缓冲区什么时候可以有足够的数据,这样我的read()调用就可以返回数据,因为它现在处于暂停模式。

Update1:

事件readable是一个很好的入门方式。但是,如果我想读取一个大文件,并且读取计数> 65536,那么null将返回。

代码语言:javascript
复制
var fs = require('fs');

var stream = fs.createReadStream('./lib');
stream.on('readable', function () {
    var buffer = stream.read(65537);
    console.log(buffer.length);

});

确切地说,我想要的是stream.read()始终可以返回数据直到EOF。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-05 06:37:34

在尝试阅读之前,请等待readable事件的触发:

代码语言:javascript
复制
var fs = require('fs');

var stream= fs.createReadStream('./lib');
stream.on('readable', function () {
  var buffer = stream.read(10);
  if (buffer) {
    console.log(buffer.toString());
  }
});
票数 7
EN

Stack Overflow用户

发布于 2017-01-07 10:09:21

根据官方的文档

一旦耗尽内部缓冲区,当有更多数据可用时,“可读”事件将再次触发。

我可以使用异步/等待,这样readable.read()就可以始终返回数据,只要不是在EOF上。

代码语言:javascript
复制
let rs = fs.createReadStream('./resources/1.gif');

async function readable(): Promise<{}> {
    return new Promise(r => rs.on('readable', r));
}

async function readBytes(num: number = 0): Promise<Buffer> {
    let buf = rs.read(num);
    if (buf) {
        return new Promise<Buffer>(r => r(buf));
    }
    else {
        return new Promise<Buffer>(r => {
            this.readable().then(() => {
                this.readBytes(num).then(b => r(b));
            });
        });
    }
}

async function main() {
    console.log('begin');
    console.log((await readBytes(10)).length);
    console.log((await readBytes(65535)).length);
    console.log((await readBytes(100000)).length);
    console.log((await readBytes(10)).length);
    console.log('end');
}

main();

产出:

代码语言:javascript
复制
begin
10
65535
100000
10
end 
票数 6
EN

Stack Overflow用户

发布于 2020-02-27 17:32:51

请允许我引用文档:大小

代码语言:javascript
复制
const stream = fs.createReadStream('./lib');
stream.on('readable', () => {
   let chunk;
   while (null !== (chunk = stream.read())) {
      console.log(`Received ${chunk.length} bytes of data.`);
   }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41478192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档