Nodejs读写文件(复制文件)

一.直接操作文件

将一个比较大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');
    });
    

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

二. 使用文件流
通过文件流来实现图片的复制:
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');
});


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值