【问题标题】:WriteStream doesn't write all dataWriteStream 不会写入所有数据
【发布时间】:2019-04-16 00:12:43
【问题描述】:

第一次我用我的代码逐行读取文件。 (文件中大约 1650 行)

第二,我将文件的每一行重新格式化为多行。

3rd 我想将输出写入一个新文件。不幸的是,它并没有写出超过 16800 行的所有内容。输出大约有 15500 行。

第三次我使用以下代码:

var inputArr; //Splited Input of one line 
var Text; //inputArr transformed to a String with many lines (per start line)
var lineCounter = 0; //counts the expacted number of output lines

const fs = require('fs');
const writeStream = fs.createWriteStream('./output.txt');

for(var i=0; i<= inputArr.length; i++) {
  writeStream.write(Text);

  lineCounter = lineCounter + 1;
}

writeStream.end();

如何将所有行写入输出文件?

【问题讨论】:

    标签: javascript node.js createwritestream


    【解决方案1】:

    如何将所有行写入输出文件?

    如果不检测流何时已满,然后等待它说可以再次写入,您将无法写入大量数据。在stream.writable doc 中有一个非常详细的示例说明如何做到这一点。

    以下是文档的摘录,说明了如何做到这一点:

    // Write the data to the supplied writable stream one million times.
    // Be attentive to back-pressure.
    function writeOneMillionTimes(writer, data, encoding, callback) {
      let i = 1000000;
      write();
      function write() {
        let ok = true;
        do {
          i--;
          if (i === 0) {
            // last time!
            writer.write(data, encoding, callback);
          } else {
            // see if we should continue, or wait
            // don't pass the callback, because we're not done yet.
            ok = writer.write(data, encoding);
          }
        } while (i > 0 && ok);
        if (i > 0) {
          // had to stop early!
          // write some more once it drains
          writer.once('drain', write);
        }
      }
    }
    

    基本上,您必须注意stream.write() 的返回值,当它说流已满时,您必须在drain 事件上重新开始写入。


    您不会在阅读和写作时都显示您的整个代码。如果您只是读取流,修改它然后将结果写入不同的文件,您可能应该使用管道,也许使用转换,然后流将自动为您处理所有读取、写入和背压检测。

    您可以阅读有关转换流here 的信息,因为这听起来可能是您真正想要的。然后,您将转换流的输出通过管道传输到您的输出流文件,所有的背压都将自动为您处理。

    【讨论】:

    • 谢谢。我想通了管道,但似乎对我不起作用。我试图理解 writeOneMillionTimes 函数(我不是开发人员)。作家的背后是什么?我是否必须用该函数替换我的 for 循环?如何将该函数调整为我的代码?
    • @NewbieXXL - 如果不了解流的工作原理以及如何正确编程,您就不能期望解决您试图解决的问题。如果您查看actual documentation reference,该功能中的writer 应该很清楚。这是一个可写流。请阅读、学习和学习。我们不只是为您编写完成的代码。我们教你在哪里可以找到你需要的信息,你必须自己学习。只要.write() 返回false,你就不能再写了,直到drain 事件被触发。
    • @NewbieXXL - 您提到“我不是开发人员”只是意味着您必须学习成为开发人员才能编写这样的代码。根据此代码的上下文,有一些更简单的方法可以将数据写入文件,例如 fs.writeFile()fs.writeSync() 等......这可能也可能不合适。
    • 我喜欢学习!我想了解 nodejs 文档。但这对我作为新手来说并不是不言自明的。我不认识成功流的导入详细信息。我写了很多代码并删除,因为它不起作用。我事先已经对缓冲区、您的示例和 fs.writeFile() 进行了试验。没有成功,这就是我在这里发帖的原因。
    • @NewbieXXL - 我建议您备份并解释(在您的问题中使用“编辑”按钮)您要解决的顶级问题是什么。然后,也只有到那时,我们才能提出一个更好或更简单的方法来解决这个问题。如果不注意流何时已满,就无法将大量数据写入流。你就是做不到。
    猜你喜欢
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多