Nodejs读写文件

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

     一.直接操作文件

     最简单的两个fs.readFilefs.writeFile

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

var fs = require('fs');
fs.readFile('./json.json',function(err,data){
if(err) throw err;


var jsonObj = JSON.parse(data);
var space = ' ';
var newLine = '\n';
var chunks = [];
var length = 0;

for(var i=0,size=jsonObj.length;i<size;i++){
var one = jsonObj[i];
//what value you want
var value1 = one['value1'];
var value2 = one['value2'];
....
var value = value1 +space+value2+space+.....+newLine;
var buffer = new Buffer(value);
chunks.push(buffer);
length += buffer.length;
}

var resultBuffer = new Buffer(length);
for(var i=0,size=chunks.length,pos=0;i<size;i++){
chunks[i].copy(resultBuffer,pos);
pos += chunks[i].length;
}

fs.writeFile('./resut.text',resultBuffer,function(err){
if(err) throw err;
console.log('has finished');
});

});

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

    

       二. 使用文件流

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

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

var fs = require('fs');
var rOption = {
flags : 'r',
encoding : null,
mode : 0666
}

var wOption = {
flags: 'a',
encoding: null,
mode: 0666
}

var fileReadStream = fs.createReadStream('./myjpg.jpg',rOption);
var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg',wOption);

fileReadStream.on('data',function(data){
fileWriteStream.write(data);

});

fileReadStream.on('end',function(){
console.log('readStream end');
fileWriteStream.end();
});

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

var fs = require('fs');

var fileReadStream = fs.createReadStream('./myjpg.jpg');
var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg');
fileReadStream.pipe(fileWriteStream);

fileWriteStream.on('close',function(){
console.log('copy over');
});

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

var http = require("http");
var fs = require("fs"),
var path = require("path"),
var url = require("url");

var server = http.createServer(function(req, res) {
var pathname = url.parse(req.url).pathname;
console.log(pathname);
var filepath = path.join("./tmp", "wwwroot", pathname);
console.log(filepath);
var stream = fs.createReadStream(filepath, {flags : "r", encoding : null});
stream.on("error", function() {
res.writeHead(404);
res.end();
});
stream.pipe(res);
});
server.on("error", function(error) {
console.log(error);
});
server.listen(8088,function(){
console.log('server listen on 8088');
});

 

posted @ 2012-02-18 20:50  lengyuhong  阅读(17510)  评论(6编辑  收藏  举报