首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将异步输出重定向到文件?

如何将异步输出重定向到文件?
EN

Stack Overflow用户
提问于 2015-05-06 01:58:51
回答 2查看 440关注 0票数 0

我有一个Node.js脚本,它读取文件的内容,对其内容进行一些转换,并记录输出:

代码语言:javascript
复制
var transformer = require('./transformer'),
    fs = require('fs'),
    file = process.argv[2];

if (!file) {
    throw 'no file specified\n';
}

fs.readFile(file, 'utf-8', function (err, data) {
    if (err) {
        throw err;
    }

    transformer.transform(data, function (text) {
        console.log(text);
    });
});

这样做很好:

代码语言:javascript
复制
$ node transform.js myfile.txt

这样做是可行的:

代码语言:javascript
复制
$ node transform.js myfile.txt > anotherfile.txt

但是,当我试图将输出重定向到正在读取的同一个文件时,该文件将变为空白:

代码语言:javascript
复制
$ node transform.js myfile.txt > myfile.txt

使用tee相同的东西

代码语言:javascript
复制
$ node transform.js myfile.txt | tee myfile.txt

奇怪的是,这样做是可行的:

代码语言:javascript
复制
$ node transform.js myfile.txt >> myfile.txt

但我不想附加到文件中-我想覆盖它的内容。

我认为问题在于,由于fs.readFile是异步的,所以console.log也是异步调用的--也就是说,它一次获得大块数据,而不是所有数据。我想我可以用fs.readFileSync代替,但是有什么正确的方法来处理这个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-06 02:41:24

这个问题实际上不是在节点内部,而是在shell中。当您使用>重定向时,shell所做的第一件事就是打开文件进行写入,清空文件。您的程序将从该空文件中读取,在您的示例中,空输入意味着空输出。

这也将导致一个空文件,而不管myfile.txt的初始内容如何。

代码语言:javascript
复制
$ cat myfile.txt > myfile.txt 

一种解决方案是在Node脚本中编写文件,而不是使用重定向。您已经在那里指定和读取文件,那么为什么不也在argv中指定一个输出文件并将其写入,而不是使用shell重定向呢?只需注意构造代码,以便读取和写入相同的文件即可。

正如@slebetman在评论中指出的那样,另一种解决方案是cat myfile.txt > tmp; mv tmp myfile.txt (或者我的首选:cat myfile.txt > tmp && mv tmp myfile.txt)。

票数 1
EN

Stack Overflow用户

发布于 2015-05-06 02:37:58

问题是

  • 你要打开文件读,
  • 然后打开文件进行写(清空),
  • 然后从一个空文件中读取。
  • 什么都不改变
  • 什么也不写

我认为你想要的是:

  • 开放阅读
  • 读取和缓冲
  • 转换
  • 开放写作

有几种方法可以做到:

1)同步读取文件。Node.js 0.12支持这一点

代码语言:javascript
复制
var transformer = require('./transformer'),
    fs = require('fs'),
    file = process.argv[2];

if (!file) {
    throw 'no file specified\n';
}

fs.readFileSync(file, 'utf-8', function (err, data) {
    if (err) {
        throw err;
    }

    transformer.transform(data, function (text) {
        console.log(text);
    });
});

2)使用“溪流”

这真的是最好的方法。尤其是如果你想学习Node.js

我所知道的了解流的最好方法是从NodeSchool:http://nodeschool.io/#workshoppers,试试stream-adventure

到最后,您将拥有自己的这类问题。

祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30066192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档