NodeJS:fs.createReadStream 有时不会读取所需的 "start" 和 "end" 字节
NodeJS: fs.createReadStream sometimes does not read the desired "start" and "end" bytes
我目前正在使用 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)。
这个函数 运行s 在一个循环中(假设这个 运行s 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')
它 returns chunk
的数据。
你也在解析第一块数据。
您应该解决 .on('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)。
这个函数 运行s 在一个循环中(假设这个 运行s 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')
它 returns chunk
的数据。
你也在解析第一块数据。
您应该解决 .on('end')
而不是每次获取数据块时都解决。