我想通过循环以特定的顺序在Node中将行附加到文件,这是一个可写的流。
以下是我所说的简化版本:
var fs = require('fs');
var outfile = fs.createWriteStream('outfile.txt');
for (var i = 0; i < 200; i++) {
outfile.write('i', function (err, len) {
console.log('written');
});
}
我需要按顺序写入文件,这意味着它会按顺序写入12345...etc
。我的理解是outfile.write
是异步的,这意味着文件可能无序写入 - 这是正确的吗?
我从节点docs
中看到请注意,在同一文件上多次使用fs.write而不等待回调是不安全的。对于这种情况,强烈建议使用fs.createWriteStream。
所以我认为使用流是最好的,但是,我不确定是否保证在继续循环中的下一次迭代之前成功写入数据块。我应该怎么做呢?感谢。
答案 0 :(得分:0)
我认为对于当前的流和您在 2015 年拥有的流,写入从来都不是异步并行的。写入流在内存中有一个缓冲区,您可以写入该缓冲区而不是直接写入硬盘。缓冲区将使您的序列保持正确的顺序。
答案 1 :(得分:-2)
您可以使用fs.writeSync
来避免使用fs.createWriteStream
,而fs.write
没有像var arr = [9, 12, 20, 23, 26];
var target = 35;
var sigma = 5;
var n = arr.length;
// sort the numbers in ascending order
arr.sort(function(a,b){return a-b;});
// initialize the recursion
var stack = [[0,0,[]]];
while (stack[0] !== undefined){
var params = stack.pop();
var i = params[0]; // index
var s = params[1]; // sum so far
var r = params[2]; // accumulating list of numbers
// if the sum is within range, output sum
if (s >= target - sigma && s <= target + sigma){
console.log(r);
break;
// since the numbers are sorted, if the current
// number makes the sum too large, abandon this thread
} else if (s + arr[i] > target + sigma){
continue;
}
// there are still enough numbers left to skip this one
if (i < n - 1){
stack.push([i + 1,s,r]);
}
// there are still enough numbers left to add this one
if (i < n){
_r = r.slice();
_r.push(arr[i]);
stack.push([i + 1,s + arr[i],_r]);
}
}
/* [9,23] */