filesystem的缩写是fs,该模块提供本地文件的读写能力。
fs.readFile(filename, [options], callback)
filename
Stringoptions
Objectencoding
String | Null default =null
flag
String default ='r'
callback
Function
var fs = require('fs');
fs.readFile('./zimin/demo.txt', function (err, logData) {
if (err) throw err;
console.log(data);
});
上面代码使用readFile方法读取文件。readFile方法的第一个参数是文件名,第二个参数是回调函数。这两个参数中间,还可以插入一个可选参数,表示文件的编码。
fs.readFile('./zimin/demo.txt', 'utf8', function (err, logData) {
// ...
});
可用的文件编码包括“ascii”、“utf8”和“base64”。如果这个参数没有提供,默认是utf8。
如果想要同步读取文件,可以使用readFileSync方法。
fs.readFileSync(filename, [options])
var data = fs.readFileSync('./zimin/demo.json');
写入文件要使用writeFile方法。
fs.writeFile(filename, data, [options], callback)
filename
Stringdata
String | Bufferoptions
Objectencoding
String | Null default ='utf8'
mode
Number default =438
(aka0666
in Octal)flag
String default ='w'
callback
Function
fs.writeFile('./zimin/demo.txt', data, function (err) {
if (err) {
console.log(err.message);
return;
}
console.log('Saved successfully.');
});
readdir方法用于读取目录,返回一个所包含的文件和子目录的数组。
fs.readdir('./zimin', function (err, files) {
if (err) {
console.log(err);
return;
}
console.log(files);
});
Stream模式
Stream是数据处理的一种形式,可以用来取代回调函数。举例来说,传统形式的文件处理,必须先将文件全部读入内存,然后调用回调函数,如果遇到大文件,整个过程将非常耗时。Stream则是将文件分成小块读入内存,每读入一次,都会触发相应的事件。只要监听这些事件,就能掌握进展,做出相应处理,这样就提高了性能。Node内部的很多IO处理都采用Stream,比如HTTP连接、文件读写、标准输入输出。
Stream既可以读取数据,也可以写入数据。读写数据时,每读入(或写入)一段数据,就会触发一次data事件,全部读取(或写入)完毕,触发end事件。如果发生错误,则触发error事件。
fs模块的createReadStream方法用于新建读取数据流,createWriteStream方法用于新建写入数据流。使用这两个方法,可以做出一个用于文件复制的脚本copy.js。
// copy.js
var fs = require('fs');
console.log(process.argv[2], '->', process.argv[3]);
var readStream = fs.createReadStream(process.argv[2]);
var writeStream = fs.createWriteStream(process.argv[3]);
readStream.on('data', function (chunk) {
writeStream.write(chunk);
});
readStream.on('end', function () {
writeStream.end();
});
readStream.on('error', function (err) {
console.log("ERROR", err);
});
writeStream.on('error', function (err) {
console.log("ERROR", err);
});
上面代码非常容易理解,使用的时候直接提供源文件路径和目标文件路径,就可以了。
node cp.js src.txt dest.txt
Streams对象都具有pipe方法,起到管道作用,将一个数据流输入另一个数据流。所以,上面代码可以重写成下面这样:
var fs = require('fs');
console.log(process.argv[2], '->', process.argv[3]);
var readStream = fs.createReadStream(process.argv[2]);
var writeStream = fs.createWriteStream(process.argv[3]);
readStream.on('open', function () {
readStream.pipe(writeStream);
});
readStream.on('end', function () {
writeStream.end();
});