nodejs對文件的讀寫還是相當(dāng)靈活的,可以根據(jù)不同的場景來選擇不同的方法。
一.直接操作文件
最簡單的兩個fs.readFile和fs.writeFile
舉例:這個程序的功能是將一個比較大json格式的文件轉(zhuǎn)換成你想自己要格式的文件。
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'); }); });
它的原理是將文件數(shù)據(jù)一次性全部讀入內(nèi)存,優(yōu)點就是接下來都是在內(nèi)存的操作,速度會很快。但缺點也很明顯,就是當(dāng)文件非常大時,會造成內(nèi)存溢出。
二. 使用文件流
2.1 讀取文件,api相見:fs.createReadSream 和 fs.createWriterStream
以下代碼實現(xiàn)的功能就是通過文件流來實現(xiàn)圖片的復(fù)制:
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(); });
這里再補充在流中非常有用的一個函數(shù):pipe,它以用來把當(dāng)前的可讀流和另外一個可寫流連接起來?勺x流中的數(shù)據(jù)會被自動寫入到可寫流中。使用起來非常方便,依然實現(xiàn)上例中的功能:
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'); });
用這個函數(shù)可以輕松地實現(xiàn)一個靜態(tài)資源服務(wù)器:
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'); });