Node.js读写文件行

jnj*_*jnj 23 javascript node.js

我尝试逐行读取文件,并使用Node.js将其输出到另一个文件.

我的问题是由于Node.js的异步性质,有时会使线条序列混乱.

例如我的输入文件是:第1行第2行第3行

但是输出文件可能是:第1行第3行第2行

以下是我的代码.

var fs  = require("fs");
var index = 1;

fs.readFileSync('./input.txt').toString().split('\n').forEach(
function (line) { 
    console.log(line);
        fs.open("./output.txt", 'a', 0666, function(err, fd) {
            fs.writeSync(fd, line.toString() + "\n", null, undefined, function(err, written) {
            })});
    }
);
Run Code Online (Sandbox Code Playgroud)

任何想法都将不胜感激,谢谢.

pen*_*tur 36

如果您正在编写同步代码,请仅使用同步函数:

var fs  = require("fs");

fs.readFileSync('./input.txt').toString().split('\n').forEach(function (line) { 
    console.log(line);
    fs.appendFileSync("./output.txt", line.toString() + "\n");
});
Run Code Online (Sandbox Code Playgroud)

对于异步方法,您可以编写类似的东西

var fs = require('fs'),
    async = require('async'),
    carrier = require('carrier');

async.parallel({
    input: fs.openFile.bind(null, './input.txt', 'r'),
    output: fs.openFile.bind(null, './output.txt', 'a')
}, function (err, result) {
    if (err) {
        console.log("An error occured: " + err);
        return;
    }

    carrier.carry(result.input)
        .on('line', result.output.write)
        .on('end', function () {
            result.output.end();
            console.log("Done");
        });
});
Run Code Online (Sandbox Code Playgroud)

  • @AndreySidorov对于初学者来说,不混合同步和异步代码并选择单一方法更容易.例如,OP异步打开文件(这样就不会保留对`open`的调用顺序),但由于某种原因,它会使用`write`的同步版本. (4认同)