首页 > 解决方案 > NodeJS:fs.createReadStream 有时不会读取所需的“开始”和“结束”字节

问题描述

我目前正在使用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!

标签: node.jsfs

解决方案


您正在使用 ReadStream。所以.on('data')它返回chunk数据。

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

您应该解决.on('end')而不是每次获得大量数据时。


推荐阅读