【问题标题】:Why this Node stream.write not overwrite the file content? How the performance varies with Node fwrite?为什么这个 Node stream.write 不会覆盖文件内容? Node fwrite 的性能如何变化?
【发布时间】:2019-11-14 19:06:51
【问题描述】:

我的目的是为特定的时间间隔写一个文件。在区间外创建了一个节点 writeStream 并尝试在区间内使用相同的流将内容写入文件。我希望内容会被覆盖,但它已经开始附加。这是一种方法

方法一:

var fs = require('fs');
var ans = ["first","second","third","fourth","fifth"];
var i =0;
var stream = fs.createWriteStream('stats.log.info',{flags:'w'});
var writeInterval = setInterval(function(){
  var data =ans[i%ans.length] ;
  if(data.length == 0){
    console.log("Failure in ");
  }
  stream.on('error', function(err){
    console.log("error in creating a stream "+err);
    clearInterval(writeInterval);
    stream.destroy();
    return;
  });
  stream.write(data);

  i++;
},2000);

然后我将创建的流移动到最终覆盖文件内容的间隔内。 方法一:创建的流放置在区间内

var fs = require('fs');
var ans = ["first","second","third","fourth","fifth"];
var i =0;
var writeInterval = setInterval(function(){
  var stream = fs.createWriteStream('stats.log.info',{flags:'w'});

  var data =ans[i%ans.length] ;
      if(data.length == 0){
        console.log("Failure in ");
      }
      stream.on('error', function(err){
        console.log("error in creating a stream "+err);
        clearInterval(writeInterval);
        stream.destroy();
        return;
      });
      stream.write(data);

      i++;
    },2000);

我想知道如何使用一个创建的流来覆盖文件内容。我尝试了另一种使用 Node 标准文件写入的方法。它可以完美地覆盖内容。但它在间隔内包含 fopen 和 fclose ,这似乎每次都非常昂贵。这是示例

方法二:

var fs = require('fs');
var ans = ["first","second","third","fourth","fifth"];
var i =0;
var writeInterval = setInterval(function(){
  var data =ans[i%ans.length] ;
  if(data.length == 0){
    console.log("Failure in ");
  }
    var fopen_write = fs.open("curr.log", 'w', function(err, fd){
        var buf = new Buffer(data, 'utf8');
        fs.write(fd, buf, 0, buf.length, null, function(err) {
            if (err) throw 'error writing file: ' + err;
            fs.close(fd, function() {
                console.log('wrote the file successfully');
            });
        });
    })
  i++;
},2000);

关于如何评估性能更好的方法的建议真的很有帮助。

感谢您的时间和努力!

【问题讨论】:

    标签: javascript node.js fs node-streams


    【解决方案1】:

    试试

    var fs = require('fs');
    var ans = ["first","second","third","fourth","fifth"];
    var i =0;
    var stream = fs.createWriteStream('stats.log.info',{flags:'w'});
    var writeInterval = setInterval(function(){
      var data =ans[i%ans.length] ;
      if(data.length == 0){
        console.log("Failure in ");
      }
      stream.on('error', function(err){
        console.log("error in creating a stream "+err);
        clearInterval(writeInterval);
        stream.destroy();
        return;
      });
      stream.pos = 0;// set pos to 0;
      stream.write(data);
      i++;
    },2000);

    但是,这是个坏主意! pos 不是 writeStream 的标准属性,一直调用文件写入流的 write 方法意味着将数据附加到文件中,我们最好不要改变这种行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2015-09-09
      • 1970-01-01
      相关资源
      最近更新 更多