初学Node(五)文件I/O

文件读写html

  Node的出现的一个亮点就是让JS也有了读写文件的能力,并且实现起来要比其余语言更简单,对文件的一些操做咱们均可经过fs模块来完成。fs即fileSystem的缩写,fs模块能够完成对文件的全部操做。node

  能够经过fs.readFileSync来同步的读取文件:异步

var fs = require("fs");
var data = fs.readFileSync("content.txt");
console.log(data.toString());

  fs已经帮咱们实现了一个读取文件的API,咱们不用再像其余语言同样还要实例化IO对象,直接引入fs模块,调用readFileSync这个函数便可。函数

  对文件的读取也能够经过fs.readFile(path,callback)来完成,这是一个异步的读取文件API,因此参数除了要读取的文件意外还须要一个读取完成的回调函数,相比同步读取,异步读取更加高效和实用:测试

var fs = require("fs");
fs.readFile("content.txt",function(err,data){
    if(err){
        return console.log(err.stack);
    }
    console.log("--文件读取成功--");
    console.log(data.toString());
});

  能够经过fs.writeFile来实现将内容写入到一个文件,若是文件已经错在就会改变里面的内容,若是不存在就建立而后在写入内容:优化

var fs = require("fs");
var data = "我是经过JS写入到文件的内容";
fs.writeFile("JSContent.txt",data,function(err){
    if(err){
        return console.log(err.stack);
    }
    console.log("文件写入完毕");
});

  一个小demo测试读写文件的使用:ui

   新建一个file文件夹,在里面新建新建一个template.html、head.txt、body.txt、foot.txt、demo.js:spa

  template.html内容以下:命令行

 <body>
  {{head.txt}}
  {{body.txt}}
  {{foot.txt}}
 </body>

  head.txt以下:code

<h1>我是头部</h1>

  body.txt以下:

<div>我是主体</div>

  foot.txt以下:

<footer>我是尾部</footer>

  demo.js以下:

var fs = require("fs");
fs.readFile("template.html",function(err,data){
    if(err){
        return console.log("读取文件错误");
    }
    var result = data.toString().replace(/{{\w*.\w*}}/g,function(one){
        return fs.readFileSync(one.substring(2,one.length-2));
    });
    fs.writeFile("result.html",result,function(err){
        if(err){
            return console.log("生成文件错误");
        }
        console.log("生成文件成功");
    });
});

  咱们在命令行中执行node.js就会生成一个正常的result.html文件了。

以流的方式来读写文件

  利用流来读取文件:

var fs = require("fs");
var readStream = fs.createReadStream("content.txt");
readStream.setEncoding("UTF8");
readStream.on("data",function(data){
    console.log(data);
});
readStream.on("end",function(){
    console.log("文件读取完毕");
});
readStream.on("error",function(err){
    console.log("读取文件错误:"+err.stack);
});

  首先利用fs模块建立一个文件的读取流,而后设置读取内体的字符设置,读取流有三个事件分别为data,end,error,data即读取文件内容的时候,end即内容读取完毕时,error即读取文件发生错误时,咱们能够为每个事件定义对应的事件处理函数来完成咱们的操做。

  利用流来将内容写入文件:

var fs =require("fs");
var writeStream = fs.createWriteStream("content.txt");
writeStream.write("我是经过写入流写入的内容","UTF8");
writeStream.end();
writeStream.on("finish",function(){
    console.log("文件写入成功");
});
writeStream.on("error",function(err){
    console.log("写入文件时发生错误:"+err.stack);
});

  使用方式和读取流基本一致,不过事件换成了finish事件,表示文件写入成功时的事件,这个事件只有在调用end()函数以后才能被触发,end()表示内容已经写入完毕了。

  当咱们在实现一个复制文件的功能时,若是原始文件过大这个操做就会很耗时,此时咱们就要利用管道流来优化这个过程,管道流在复制文件时并不会在将第一个文件的内容读取完毕后再写入目标文件,而是每读取一段内容就将这段内容写入到文件,而后在读在些一直到文件复制完毕:

var fs =require("fs");
var readStream = fs.createReadStream("content.txt");
var writeStream = fs.createWriteStream("result.txt");
readStream.pipe(writeStream);
console.log("复制完成");

  pipe函数就是咱们所说的管道,咱们能够把它看作是链接读取流和写入流的桥梁。

相关文章
相关标签/搜索