Nodejs读写文件

释放双眼,带上耳机,听听看~!

     nodejs对文件的读写还是相当灵活的,可以根据不同的场景来选择不同的方法,具体可以参见:Nodejs fs

     一.直接操作文件

     最简单的两个
fs.readFile和
fs.writeFile

 举例:这个程序的功能是将一个比较大json格式的文件转换成你想自己要格式的文件。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1var fs = require('fs');  
2fs.readFile('./json.json',function(err,data){  
3    if(err) throw err;  
4    var jsonObj = JSON.parse(data);  
5    var space = ' ';  
6    var newLine = '\n';  
7    var chunks = [];      
8    var length = 0;  
9    for(var i=0,size=jsonObj.length;i<size;i++){  
10        var one = jsonObj[i];  
11        //what value you want         var value1 = one['value1'];  
12        var value2 = one['value2'];  
13        ....  
14        var value = value1 +space+value2+space+.....+newLine;  
15        var buffer = new Buffer(value);  
16        chunks.push(buffer);  
17        length += buffer.length;  
18    }  
19        var resultBuffer = new Buffer(length);  
20    for(var i=0,size=chunks.length,pos=0;i<size;i++){  
21        chunks[i].copy(resultBuffer,pos);  
22        pos += chunks[i].length;  
23    }  
24        fs.writeFile('./resut.text',resultBuffer,function(err){  
25        if(err) throw err;  
26        console.log('has finished');  
27    });  
28    });
29

       它的原理是将文件数据一次性全部读入内存,优点就是接下来都是在内存的操作,速度会很快。但缺点也很明显,就是当文件非常大时,会造成内存溢出。  

    

       二. 使用文件流

2.1 读取文件,api相见:
fs.createReadSream
 和 
fs.createWriterStream

       以下代码实现的功能就是通过文件流来实现图片的复制:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1var fs = require('fs');  
2var rOption = {  
3  flags : 'r',  
4  encoding : null,  
5  mode : 0666  
6}  
7var wOption = {  
8  flags: 'a',  
9  encoding: null,  
10  mode: 0666    
11}  
12var fileReadStream = fs.createReadStream('./myjpg.jpg',rOption);  
13var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg',wOption);  
14fileReadStream.on('data',function(data){  
15  fileWriteStream.write(data);  
16    });  
17fileReadStream.on('end',function(){  
18  console.log('readStream end');  
19  fileWriteStream.end();  
20});
21

       这里再补充在流中非常有用的一个函数:
pipe,它以用来把当前的可读流和另外一个可写流连接起来。可读流中的数据会被自动写入到可写流中。使用起来非常方便,依然实现上例中的功能:      


1
2
3
4
5
6
7
8
1var fs = require('fs');  
2var fileReadStream = fs.createReadStream('./myjpg.jpg');  
3var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg');  
4fileReadStream.pipe(fileWriteStream);  
5fileWriteStream.on('close',function(){  
6  console.log('copy over');    
7});
8

       用这个函数可以轻松地实现一个静态资源服务器:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1var http = require("http");  
2var fs = require("fs"),  
3var path = require("path"),  
4var url = require("url");  
5var server = http.createServer(function(req, res) {  
6  var pathname = url.parse(req.url).pathname;  
7  console.log(pathname);  
8  var filepath = path.join("./tmp", "wwwroot", pathname);  
9  console.log(filepath);  
10  var stream = fs.createReadStream(filepath, {flags : "r", encoding : null});  
11  stream.on("error", function() {  
12      res.writeHead(404);  
13      res.end();  
14  });  
15  stream.pipe(res);  
16});  
17server.on("error", function(error) {  
18  console.log(error);  
19});  
20server.listen(8088,function(){  
21  console.log('server listen on 8088');  
22});
23

 

给TA打赏
共{{data.count}}人
人已打赏
安全技术

对称加密与非对称加密优缺点详解

2021-8-18 16:36:11

安全技术

C++ 高性能服务器网络框架设计细节

2022-1-11 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索