我一直试图找到一种在使用 Node.js 时写入文件的方法,但没有成功。我怎样才能做到这一点?
在 Node.js 中编写文件
File System 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!");
});
// Or
fs.writeFileSync('/tmp/test-sync', 'Hey there!');
目前有三种写文件的方式:
fs.write(fd, buffer, offset, length, position, callback
)您需要等待回调以确保将缓冲区写入磁盘。它没有缓冲。
fs.writeFile(filename, data, [encoding], callback)
所有数据必须同时存储;您不能执行顺序写入。
fs.createWriteStream(path, [options]
)创建一个
WriteStream
,这很方便,因为您不需要等待回调。但同样,它没有缓冲。
A WriteStream
,顾名思义,是一个流。根据定义,流是包含沿一个方向(源 ► 目标)移动的数据的“缓冲区”。但是可写流不一定是“缓冲的”。当您写入n
时间时,流被“缓冲” ,并且在 time 时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 年 2 月 6 日发布的稳定版)中,现在支持两个函数:
cork()
和
uncork()
. 似乎这些函数最终将允许您缓冲/刷新写入调用。
例如,在 Java 中有一些类提供缓冲流(BufferedOutputStream
,BufferedWriter
...)。如果写入三个字节,这些字节将存储在缓冲区(内存)中,而不是仅对三个字节进行 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();
});
同步写入
fs.writeFileSync(文件,数据[,选项])
fs = require('fs');
fs.writeFileSync("foo.txt", "bar");
异步写入
fs.writeFile(文件,数据[,选项],回调)
fs = require('fs');
fs.writeFile('foo.txt', 'bar', (err) => { if (err) throw err; });
在哪里
file <string> | <Buffer> | <URL> | <integer> filename or file descriptor
data <string> | <Buffer> | <Uint8Array>
options <Object> | <string>
callback <Function>
值得阅读官方文件系统 (fs)文档。
更新:异步/等待
fs = require('fs');
util = require('util');
writeFile = util.promisify(fs.writeFile);
fn = async () => { await writeFile('foo.txt', 'bar'); }
fn()
var path = 'public/uploads/file.txt',
buffer = new Buffer("some content\n");
fs.open(path, 'w', function(err, fd) {
if (err) {
throw 'error opening file: ' + err;
}
fs.write(fd, buffer, 0, buffer.length, null, function(err) {
if (err) throw 'error writing file: ' + err;
fs.close(fd, function() {
console.log('file written');
})
});
});