协慌网

登录 贡献 社区

在 Node.js 中编写文件

我一直试图找到一种在使用 Node.js 时写入文件的方法,但没有成功。我怎样才能做到这一点?

答案

文件系统 API中有很多细节。最常见的方式是:

const fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
    if(err) {
        return console.log(err);
    }

    console.log("The file was saved!");
});

目前有三种写文件的方法:

  1. fs.write(fd, buffer, offset, length, position, callback

    您需要等待回调以确保将缓冲区写入磁盘。它没有缓冲。

  2. fs.writeFile(filename, data, [encoding], callback)

    所有数据必须同时存储; 您无法执行顺序写入。

  3. fs.createWriteStream(path, [options]

    创建一个WriteStream ,这很方便,因为您不需要等待回调。但同样,它没有缓冲。

正如名称所示, WriteStream是一个流。根据定义,流是 “缓冲区”,包含在一个方向上移动的数据(源►目的地)。但是可写流不一定是 “缓冲的”。当您写n次时,流被 “缓冲”,并且在时间n+1 ,流将缓冲区发送到内核(因为它已满并需要刷新)。

换句话说: “缓冲区” 是对象。它是否 “缓冲” 是该对象的属性。

如果查看代码, WriteStream继承可写的Stream对象。如果你注意,你会看到他们如何刷新内容; 他们没有任何缓冲系统。

如果您编写一个字符串,它将转换为缓冲区,然后发送到本机层并写入磁盘。在编写字符串时,它们不会填充任何缓冲区。所以,如果你这样做:

write("a")
write("b")
write("c")

你在做:

fs.write(new Buffer("a"))
fs.write(new Buffer("b"))
fs.write(new Buffer("c"))

这是对 I / O 层的三次调用。虽然您使用的是 “缓冲区”,但数据不会被缓冲。缓冲流可以执行: fs.write(new Buffer ("abc")) ,一次调用 I / O 层。

截至目前,在 Node.js v0.12(2015 年 6 月 6 日公布的稳定版)中,现在支持两个函数: cork()uncork() 。看来这些函数最终会允许你缓冲 / 刷新写调用。

例如,在 Java 中,有一些类提供缓冲流( BufferedOutputStreamBufferedWriter ...)。如果写入三个字节,这些字节将存储在缓冲区(内存)中,而不是仅为三个字节进行 I / O 调用。当缓冲区已满时,内容将被刷新并保存到磁盘。这提高了性能。

我没有发现任何东西,只记得应该如何进行磁盘访问。

你当然可以使它更先进一点。无阻塞,写入碎片,而不是一次写入整个文件:

var fs = require('fs');
var stream = fs.createWriteStream("my_file.txt");
stream.once('open', function(fd) {
  stream.write("My first row\n");
  stream.write("My second row\n");
  stream.end();
});