初學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函數就是咱們所說的管道,咱們能夠把它看作是鏈接讀取流和寫入流的橋樑。

相關文章
相關標籤/搜索