读写文件
使用fs模块来实现所有有关文件和目录的创建、写入和删除操作。在fs模块中,所有操作都可以使用同步和异步这两种方法。例如在执行读文件操作时,可以使用readFile和readFileSync(同步)方法
var fs = require('fs');
var data = fs.readFileSync('./index.html', 'utf8');
// 停止执行代码直到操作结束
console.log(data)
而异步方法将操作结果作为回调函数的参数,这种error-first回调方式可以参考另一篇博文 node.js知识点总结
在很少的场景比如读取配置文件并启动服务器才会使用同步方法
读取文件后得到的是文件原始二进制数据缓存区中的内容,使用toString方法将该内容以字符串形式输出
fs.readFile('./test.txt', function(err, data){
if(err) console.log('文件读取发生错误');
else {
// console.log(data);
console.log(data.toString());
}
})
同样写文件也是分为writeFile和writeFileSync
fs.writeFile(filename, data, [options], callback)
例如
fs.writeFile('./message.txt', '第一行\r\n第二行', function(err){
if(err) console.log...
else console.log('写文件操作成功');
})
从指定位置开始读写
首先需要使用fs模块中的open方法或openSync方法打开文件
var fs = require('fs');
fs.open('./message.txt', 'r', function(err, fd){
// 创建一个文件缓存区,将数据读进来
var buf = new Buffer(255);
// 一个汉字的utf编码为3个字节数据
fs.read(fd, buf, 0, 9, 3, function(err), byteRead, buffer){
console.log(buffer.slice(0, bytesRead).toString());
})
})
创建和读取目录
使用mkdir来创建目录,callback和之前的使用方式一致
fs.mkdir(path, [mode], callback)
mode参数用于指定该目录权限,默认值为0777(任何人可读写)。
读取目录可使用readdir
fs.readdir(path, callback);
流的基本概念
当使用readFile方法读取文件内容时,Node.js首先将文件内容完整读入缓存区,再从缓存区读取文件内容。在使用writeFile的时候,首先将该内容完整读入缓存区,然后一次性将缓存区中内容写入文件。而read方法则不同: 1、将需要书写的数据写到一个内容缓存区。2、等缓存区写满后再将该缓存区内容写入到文件中。在文件读写过程中允许执行其他处理。
在一个应用程序中,流是一组有序的、有起点和终点的字节数据的传输手段。在各种对象之间传输数据的时候,总是先将该对象所包含的数据转换成各种形式的流数据(即字节数据),再通过流的传输,到达目的地将数据流转换成该对象中可以使用的数据。
在Node.js中,使用各种实现了stream.Writeable接口的对象来将流数据写入对象,所有这些对象都是继承了EventEmitter类的实例对象,在写入数据过程中,会触发各种事件
使用readStream对象读取
在fs模块中,可以使用createReadStream方法创建一个将文件内容读取为数据流的ReadStream对象
fs.createReadStream(path, [options]);
在实际使用中
var file = fs.createReadStream('./message.txt', {start: 3, end: 12 });
file.on('open', function(fd){
console.log('开始读取文件');
})
file.on('data', function(data){
console.log('读取到数据');
})
file.on('end', function(){
console.log('文件全部读取完毕');
})
file.on('close', function(){
console.log('文件被关闭');
})
file.on('error', function(){
console.log('读取文件失败')
})
写入文件也类似
var file = fs.createReadStream('./message.txt');
var out = fs.createWriteStream('./anotherMessage.txt');
file.on('data', function(data){
// WriteStream对象的write方法
out.write(data);
})
out.on('open', function(){ ... })