Node.js读写文件

前言:本文大部分都是廖雪峰老师的教程内容,自己对其中的一些知识进行了总结和梳理。不对之处还望指正
这篇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');

你可能感兴趣的:(node.js,javascript,异步)