如何递增写入文本文件并刷新输出
我的Node.js程序 – 这是一个普通的命令行程序,大体上不会做任何exception的操作,没有任何系统特定的或asynchronous的或类似的东西 – 需要不时写信息到文件,然后它会被^ C中断,它需要文件的内容仍然在那里。
我已经尝试使用fs.createWriteStream
但只是结束了一个0字节的文件。 (如果程序通过运行主文件的末尾来结束程序,则该文件将包含文本,但这不是我的场景。)
我已经尝试使用winston
但最终没有创build文件。 (如果程序通过运行主文件的末尾来结束程序,则该文件将包含文本,但这不是我的场景。)
而fs.writeFile
完美的工作,当你有所有你想要fs.writeFile
的文字,但似乎并不支持一次追加一行。
推荐的方法是什么?
编辑:我试过的具体代码:
var fs = require('fs') var log = fs.createWriteStream('test.log') for (var i = 0; i < 1000000; i++) { console.log(i) log.write(i + '\n') }
运行几秒钟,点击^ C,留下一个0字节的文件。
NodeJS不能以传统方式工作。 它使用一个单线程,所以通过运行一个大的循环并在里面进行I / O,你不会给它一个机会(例如释放CPU)来执行其他的asynchronous操作,例如:将内存缓冲区刷新到实际的文件。
逻辑必须是 – 执行一次write
,然后将你的函数(调用write)作为callback函数传递给process.nextTick
或者作为回写写入stream的drain
事件(如果在上次写入期间缓冲区已满)。
这是一个快速和肮脏的版本,这就是你所需要的。 请注意,没有长时间运行的循环或其他CPU堵塞,而是安排我以后的写入,以便将来快速返回,暂时释放CPU以用于其他事情。
var fs = require('fs') var log = fs.createWriteStream('test.log'); var i = 0; function my_write() { if (i++ < 1000000) { var res = log.write("" + i + "\r\n"); if (!res) { log.on('drain',my_write); } else { process.nextTick(my_write); } console.log("Done" + i + " " + res + "\r\n"); } } my_write();
你正在使用for循环写入文件,这是坏的,但这是其他情况。 首先createWriteStream不会自动closures文件,你应该调用close。 如果在for循环之后立即调用close,它将会closures而不写,因为它是asynchronous的。
有关更多信息,请阅读此处: https : //nodejs.org/api/fs.html#fs_fs_createwritestream_path_options
问题是循环内部的asynchronous函数。
结果Node提供了一个较低级别的文件I / O API,似乎工作正常!
var fs = require('fs') var log = fs.openSync('test.log', 'w') for (var i = 0; i < 100000; i++) { console.log(i) fs.writeSync(log, i + '\n') }
- Docker:ENTRYPOINT无法执行命令,因为它找不到该文件
- 在Node.js中,读取一个.html文件的目录并在其中search元素属性?
- 我怎样才能读取和更改nodejs文件的细节?
- Node.js FIFO – 写入文件描述符时进程挂起
- nodejs – fs.createReadStream()。pipe,如何知道文件大小问题
- 在Node.js中处理一个100MB的文件
- Node.js:fs.readdir不会返回由fs.writeFile写入的文件
- 如何在docker构buildDockerfile时cachingRUN npm install指令
- node.js – 在创build临时文件之前检查文件是否存在