异步读文件
按照JavaScript的标准,异步读取一个文本文件的代码如下:
'use strict';
var fs = require('fs');
fs.readFile('sample.txt', 'utf-8', function (err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
}
});
请注意, sample.txt 文件必须在当前目录下,且文件编码为 utf-8 。
异步读取时,传入的回调函数接收两个参数,当正常读取时, err 参数为 null , data 参数为读取到的String。当读取发生错误时, err 参数代表一个错误对象, data 为 undefined 。这也是Node.js标准的回调函数:第一个参数代表错误信息,第二个参数代表结果。后面我们还会经常编写这种回调函数。
由于 err 是否为 null 就是判断是否出错的标志,所以通常的判断逻辑总是:
if (err) {
// 出错了
} else {
// 正常
}
如果我们要读取的文件不是文本文件,而是二进制文件,怎么办?
下面的例子演示了如何读取一个图片文件:
'use strict';
var fs = require('fs');
fs.readFile('sample.png', function (err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
console.log(data.length + ' bytes');
}
});
当读取二进制文件时,不传入文件编码时,回调函数的 data 参数将返回一个 Buffer 对象。在Node.js中, Buffer 对象就是一个包含零个或任意个字节的数组(注意和Array不同)。
Buffer 对象可以和String作转换,例如,把一个 Buffer 对象转换成String:
// Buffer -> String
var text = data.toString('utf-8');
console.log(text);
或者把一个String转换成 Buffer :
// String -> Buffer
var buf = new Buffer(text, 'utf-8');
console.log(buf);