nodejs对文件的读写还是相当灵活的,可以根据不同的场景来选择不同的方法。
一.直接操作文件
最简单的两个fs.readFile和fs.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'); });