前言:本文大部分都是廖雪峰老师的教程内容,自己对其中的一些知识进行了总结和梳理。不对之处还望指正
这篇blog主要作为我自己的知识储备吧,所以没有用很多的话来解释,只详写到自己能懂为止。
在看这篇文章之前,我觉得你需要对JavaScript中的Buffer对象
和同步异步
有所了解。
关于Buffer对象,我推荐阮一峰老师的这一篇:Buffer对象
而同步异步我推荐你去看看掘金上的一篇文章:这一次,彻底弄懂JavaScript执行机制,不局限与同步异步,非常值得一看。
模块导入
我们要读写文件,首先要导入Node.js内置的fs
模块即文件系统模块(类似于JAVA里面的包或者类,里面封装了方法)
'use strict'
var fs = require('fs');
读文件
- 异步方法:
'use strict'
var fs = require('fs');
fs.readFile('test.txt','utf-8',function(err,data) { //读取文本文件
if(err) {
console.log(err);
} else {
console.log(data);
}
});
这个方法包含三个参数:文件索引地址、编码格式、回调函数。其中回调函数接收两个参数,错误对象err
和读取的数据data
。
当读取二进制文件时,不传入文件编码时,回调函数的data参数将返回一个Buffer对象。
在Node.js中,Buffer对象就是一个包含零个或任意个字节的数组(注意和Array不同):
fs.readFile('sample.png', function (err, data) { //读取二进制文件
if (err) {
console.log(err);
} else {
console.log(data);
console.log(data.length + ' bytes');
}
});
Buffer
对象和String之间可以相互转化:
//Buffer -> String
var text = data.toString('utf-8');
//String -> Buffer
var buf = Buffer.from(text,'utf-8');
- 同步方法:
'use strict';
var fs = require('fs');
var data = fs.readFileSync('sample.txt', 'utf-8');
console.log(data);
相比于异步函数,多了Sync
(同时、同步)后缀,不接受回调函数。函数直接返回结果,需要用try...catch
来捕获错误:
try{
var data = fs.readFileSync('test.txt','utf-8');
console.log(data);
} catch(err) {
console.log(err);
}
写文件
大体原理与读文件类似,这里就不赘述了,需要注意的是跟python一样,JS的写入会覆盖掉先前存在的文本。贴一下大体代码:
'use strict';
var fs = require('fs');
var data = 'Hello';
//异步方法,接受参数:文件索引地址、数据、回调函数。传入String则默认按UTF-8编码。
fs.writeFile('test.txt',data,function(err){
if(err) {
console.log(err);
} else{
console.log('ok.');
}
});
//同步方法
fs.writeFileSync('test.txt',data);
博主在测试中发现,当同时进行异步读写时,无论两者的函数谁在前,都会先执行写的操作。
文件状态
如果我们要获取文件大小,创建时间等信息,可以使用fs.stat(),它返回一个Stat对象,能告诉我们文件或目录的详细信息:
'use strict';
var fs = require('fs');
//异步实现
fs.stat('sample.txt', function (err, stat) {
if (err) {
console.log(err);
} else {
// 是否是文件:
console.log('isFile: ' + stat.isFile());
// 是否是目录:
console.log('isDirectory: ' + stat.isDirectory());
if (stat.isFile()) {
// 文件大小:
console.log('size: ' + stat.size);
// 创建时间, Date对象:
console.log('birth time: ' + stat.birthtime);
// 修改时间, Date对象:
console.log('modified time: ' + stat.mtime);
}
}
});
//同步实现
var stat = fs.statSync('test.txt');