我想从文件中读取字节,下面是示例代码:
var fs = require('fs');
var stream= fs.createReadStream('./lib');
console.log(stream.read(10));返回空。
我认为这是因为read()方法直接从内部缓冲区获取数据。如果缓冲区没有足够的数据,则返回null。read()方法是一个同步调用,不传递回调,因此设计是有意义的。但是,我不知道内部缓冲区什么时候可以有足够的数据,这样我的read()调用就可以返回数据,因为它现在处于暂停模式。
Update1:
事件readable是一个很好的入门方式。但是,如果我想读取一个大文件,并且读取计数> 65536,那么null将返回。
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。
发布于 2017-01-05 06:37:34
在尝试阅读之前,请等待readable事件的触发:
var fs = require('fs');
var stream= fs.createReadStream('./lib');
stream.on('readable', function () {
var buffer = stream.read(10);
if (buffer) {
console.log(buffer.toString());
}
});发布于 2017-01-07 10:09:21
根据官方的文档
一旦耗尽内部缓冲区,当有更多数据可用时,“可读”事件将再次触发。
我可以使用异步/等待,这样readable.read()就可以始终返回数据,只要不是在EOF上。
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();产出:
begin
10
65535
100000
10
end 发布于 2020-02-27 17:32:51
请允许我引用文档:大小
const stream = fs.createReadStream('./lib');
stream.on('readable', () => {
let chunk;
while (null !== (chunk = stream.read())) {
console.log(`Received ${chunk.length} bytes of data.`);
}
});https://stackoverflow.com/questions/41478192
复制相似问题