【问题标题】:node.js modify file data stream?node.js修改文件数据流?
【发布时间】:2018-01-28 06:02:36
【问题描述】:

我需要将一个大型数据文件复制到另一个目标并进行一些修改。 fs.readFilefs.writeFile 非常慢。我需要逐行阅读,修改并写入新文件。我发现了这样的东西:

fs.stat(sourceFile, function(err, stat){
    var filesize = stat.size;

    var readStream = fs.createReadStream(sourceFile);

    // HERE I want do some modifications with bytes

    readStream.pipe(fs.createWriteStream(destFile));
})

但是如何进行修改呢?我试图通过data 事件获取数据

readStream.on('data', function(buffer){
    var str = strToBytes(buffer);
    str.replace('hello', '');
    // How to write ???
});

但不明白如何将其写入文件:

【问题讨论】:

  • through2 可以帮助您。第一个示例代码几乎准确地显示了您想要做什么。

标签: javascript node.js filestream fs


【解决方案1】:

您应该使用transform 流并使用这样的管道:

fs.createReadStream('input/file.txt')
     .pipe(new YourTransformStream())
     .pipe(fs.createWriteStream('output/file.txt'))

那只是implementing the transform stream as in this doc的问题

您还可以像这样使用scramjet 使这对您更容易:

fs.createReadStream('input/file.txt')
     .pipe(new StringStream('utf-8'))
     .split('\n')                                          // split every line
     .map(async (line) => await makeYourChangesTo(line))   // update the lines
     .join('\n')                                           // join again
     .pipe(fs.createWriteStream('output/file.txt'))

我认为这比手动操作更容易。

【讨论】:

  • 如何同步执行此操作,如我如何知道何时完成然后返回调用函数?
  • 好吧,您不需要同步进行,对于流,这不是重点。您可以使用 async/await,然后只返回一个在 onFinished 上解析的承诺。如果您愿意,请创建一个关于此的新问题并将其发布在这里 - 我会更详细地回答。 :)
猜你喜欢
  • 2015-04-08
  • 1970-01-01
  • 2013-07-25
  • 2014-09-15
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
相关资源
最近更新 更多