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