NodeJS:fs.createReadStream 有时不会读取所需的"start"和"end"字节



我目前正在使用fs.createReadStream从文件中读取一定数量的字节。

这是我的代码

const readFile = (file, start, end) => {
return new Promise((resolve, reject) => {
let readStream = fs.createReadStream(file, { start : start, end: start+end })
readStream.on("error", () => {console.log("Error occured on " + file)})
readStream.on('data', function(d) {
console.log(start)
console.log(start+end)
console.log(d.byteLength)
resolve(d)
});
})
}

我将开始设置为0。结尾是我想要的字节(例如:5000(。

这个函数循环运行(假设它运行10次(

这是的输出(我记录了我得到的尺寸(

start: 0
end: 5000
result: 5001
start: 0
end: 5000
result: 5001
start: 0
end: 5000
result: 5001
start: 0
end: 5000
result: 5001
start: 0
end: 5000
result: 432
start: 0
end: 5000
result: 5001
start: 0
end: 5000
result: 4569
start: 0
end: 5000
result: 432

请注意那些阅读量低于5000的人。

只有当我在超过10次的循环中多次运行时才会发生这种情况。

这里出了什么问题?

编辑:正如您所看到的,参数都是相同的。甚至这些文件都是原始文件的多个副本。

编辑2.0:这解决了我的问题!为了获得所需的数据,我初始化了一个缓冲区,并连接了来自.on('data')的块,最后在.on('end')上解析

这是更新后的功能:

const readFile = (file, start, end) => {
return new Promise((resolve, reject) => {
let data = Buffer.alloc(0)
let readStream = fs.createReadStream(file, { start : start, end: start+end })
readStream.on("error", () => {console.log("Error occured on " + file)})
readStream.on('data', function(d) {
data = Buffer.concat([data, d])
});
readStream.on("end", function(d) {
console.log(file)
console.log(start)
console.log(start+end)
console.log(data.byteLength)
resolve(data)
})
})
}

非常感谢tawfik nasser!

您正在使用ReadStream。因此.on('data')返回数据的chunk

此外,您正在解析第一块数据。

您应该解析.on('end'),而不是每次获取大块数据时都解析。

最新更新