初学Node(五)文件I/O
文件讀寫
Node的出現的一個亮點就是讓JS也有了讀寫文件的能力,而且實現起來要比其他語言更簡單,對文件的一些操作我們都可通過fs模塊來完成。fs即fileSystem的縮寫,fs模塊可以完成對文件的所有操作。
可以通過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測試讀寫文件的使用:
?新建一個file文件夾,在里面新建新建一個template.html、head.txt、body.txt、foot.txt、demo.js:
template.html內容如下:
<body>{{head.txt}}{{body.txt}}{{foot.txt}}</body>head.txt如下:
<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函數就是我們所說的管道,我們可以把它看做是連接讀取流和寫入流的橋梁。
?
轉載于:https://www.cnblogs.com/shinhwazt/p/6067745.html
總結
以上是生活随笔為你收集整理的初学Node(五)文件I/O的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Supervisor 守护你的进程
- 下一篇: 在ubuntu上安装最新稳定版本的nod