我正在尝试读取大量文件并将其中的信息合并为一个。这是我得到的实现。我想将其重写为 .pipe(),但结果只是在每次迭代时覆盖文件。我正在寻求帮助。
async joinSlices(path) {
const wrs = new WriteStream('./bigJSON.json');
const files = fs.readdirSync(path);
for (let file of files) {
console.log(file + ' start');
await new Promise((res, rej) => {
const rs = new ReadStream(path + file, 'utf-8');
rs.on('data', (chunk) => { wrs.write(chunk); });
rs.on('end', (data) => { console.log(file + ' end'); });
rs.on('close', (data) => { res(); });
});
}
wrs.destroy();
console.log('write stream end');
}
如果两个流都在其主体中声明,并且在记录末尾放置了一个承诺,则循环开始,但每次迭代都会发生覆盖。
Node.js 特定的 Stream API 使用起来有点麻烦。幸运的是,这些流也是标准化 Iteration_protocols 的实例(也在浏览器中实现),这意味着您可以按如下方式使用
for await of
。
import fs from 'fs'
const inDir = 'in/'
const outFile = fs.createWriteStream('./out.json')
outFile.write('[')
let first = true
for (const fileName of fs.readdirSync(inDir)) {
if (first) {
first = false
} else {
outFile.write(',')
}
const file = fs.createReadStream(inDir + fileName, { encoding: 'utf-8' })
for await (const str of file) {
outFile.write(str)
}
}
outFile.write(']')
outFile.close()