摘要:一個例子測試返回值當緩存區(qū)寫滿時,輸出一個例子當緩存區(qū)數(shù)據(jù)全部輸出時,觸發(fā)事件系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。數(shù)據(jù)可讀文件讀取完成系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。要寫入的數(shù)據(jù)文件已經(jīng)打開,文件描述符是文件系統(tǒng)模塊同步更新
環(huán)境:Node v8.2.1; Npm v5.3.0; OS Windows10
1、fs 模塊APInodejs的文件操作大部分API都提供了同步和異步的兩種方式,下面是異步API結構圖,同步方法在異步方法后面加【Sync】就行了
1.1 API結構圖 1.2 文件讀寫模式對應編碼 2、一些例子下面是部分API的例子,對部分API的一個簡單代碼實現(xiàn)
2.1 readFile讀取文件//readFile(filename,[options],callback); /** * filename, 必選參數(shù),文件名 * [options],可選參數(shù),可指定flag(文件操作選項,如r+ 讀寫;w+ 讀寫,文件不存在則創(chuàng)建)及encoding屬性 * callback 讀取文件后的回調函數(shù),參數(shù)默認第一個err,第二個data 數(shù)據(jù) */ const fs = require("fs"); fs.readFile("./package.json",{flag:"r+",encoding:"utf8"},(err,data)=>{ if(err) throw err; console.log(data); })2.2 writeFile寫文件
// fs.writeFile(filename,data,[options],callback); /** * filename, 必選參數(shù),文件名 * data, 寫入的數(shù)據(jù),可以字符或一個Buffer對象 * [options],flag,mode(權限),encoding * callback 讀取文件后的回調函數(shù),參數(shù)默認第一個err,第二個data 數(shù)據(jù) */ const fs = require("fs"); const data="hello world"; const bf=Buffer.from(data); //buffer寫入 fs.writeFile("./test.txt",bf,err=>{ if(err) throw err; console.log("寫入成功"); }) //字符寫入 fs.writeFile("./test.txt",data,err=>{ if(err) throw err; console.log("寫入成功"); })2.3 以追加方式寫文件
// fs.appendFile(filename,data,[options],callback); const fs = require("fs"); const data = " hello world"; const bf = Buffer.from(data); //buffer fs.appendFile("./test.txt", bf, err => { if (err) throw err; console.log("追加成功"); }) fs.appendFile("./test.txt", data, err => { if (err) throw err; console.log("追加成功"); })2.4 open打開文件
打開文件,獲取文件描述
// fs.open(filename, flags, [mode], callback); /** * filename, 必選參數(shù),文件名 * flags, 操作標識,如"r",讀方式打開 * [mode],權限,如777,表示任何用戶讀寫可執(zhí)行 * callback 打開文件后回調函數(shù),參數(shù)默認第一個err,第二個fd為一個整數(shù),表示打開文件返回的文件描述符,window中又稱文件句柄 */ const fs = require("fs"); fs.open("./test.txt","r",0666,(err,fd)=>{ if(err) throw err; console.log(fd); //3 })
【0666】為【文件權限碼】,也可以在【fs.constants】中輸出
2.5 讀文件,讀取打開的文件內(nèi)容到緩沖區(qū)中//fs.read(fd, buffer, offset, length, position, callback); /** * fd, 使用fs.open打開成功后返回的文件描述符 * buffer, 一個Buffer對象,v8引擎分配的一段內(nèi)存 * offset, 整數(shù),向緩存區(qū)中寫入時的初始位置,以字節(jié)為單位 * length, 整數(shù),讀取文件的長度 * position, 整數(shù),讀取文件初始位置;文件大小以字節(jié)為單位 * callback(err, bytesRead, buffer), 讀取執(zhí)行完成后回調函數(shù),bytesRead實際讀取字節(jié)數(shù),被讀取的緩存區(qū)對象 */ const fs = require("fs"); fs.open("./test.txt", "r", (err, fd) => { if (err) throw err; let bf = Buffer.alloc(255); fs.read(fd,bf,0,9,0,(err,bytesRead,buffer)=>{ if(err) throw err; console.log(bytesRead); console.log(buffer.toString()); }) })2.6 寫文件,將緩沖區(qū)內(nèi)數(shù)據(jù)寫入使用fs.open打開的文件
//fs.write(fd, buffer, offset, length, position, callback); /** * fd, 使用fs.open打開成功后返回的文件描述符 * buffer, 一個Buffer對象,v8引擎分配的一段內(nèi)存 * offset, 整數(shù),從緩存區(qū)中讀取時的初始位置,以字節(jié)為單位 * length, 整數(shù),從緩存區(qū)中讀取數(shù)據(jù)的字節(jié)數(shù) * position, 整數(shù),寫入文件初始位置; * callback(err, written, buffer), 寫入操作執(zhí)行完成后回調函數(shù),written實際寫入字節(jié)數(shù),buffer被讀取的緩存區(qū)對象 */ const fs = require("fs"); fs.open("./test.txt", "w", (err, fd) => { if (err) throw err; let bf = Buffer.from(" 寫入文件數(shù)據(jù)的內(nèi)容"); fs.write(fd, bf, 0, bf.length, 0, (err, bytesWritten, buffer) => { if (err) throw err; console.log(bytesWritten); console.log(`寫入的內(nèi)容:${buffer.toString()}`); }) })2.7 刷新緩存區(qū)
使用fs.write寫入文件時,操作系統(tǒng)是將數(shù)據(jù)讀到內(nèi)存,再把數(shù)據(jù)寫入到文件中,當數(shù)據(jù)讀完時并不代表數(shù)據(jù)已經(jīng)寫完,因為有一部分還可能在內(nèi)在緩沖區(qū)內(nèi)。
因此可以使用fs.fsync方法將內(nèi)存中數(shù)據(jù)寫入文件;--刷新內(nèi)存緩沖區(qū);
//fs.fsync(fd, [callback]) /** * fd, 使用fs.open打開成功后返回的文件描述符 * [callback(err, written, buffer)], 寫入操作執(zhí)行完成后回調函數(shù),written實際寫入字節(jié)數(shù),buffer被讀取的緩存區(qū)對象 */ const fs = require("fs"); fs.open("./test.txt", "a+", (err, fd) => { if (err) throw err; let bf = Buffer.from(" I love Node"); fs.write(fd, bf, 0, bf.length, 0, (err, bytesWritten, buffer) => { if (err) throw err; fs.fsync(fd,(err)=>{}); fs.close(fd,err=>{}); }) })2.8 讀取目錄
//使用fs.readdir讀取目錄,重點其回調函數(shù)中files對象 //fs.readdir(path, callback); /** * path, 要讀取目錄的完整路徑及目錄名; * [callback(err, files)], 讀完目錄回調函數(shù);err錯誤對象,files數(shù)組,存放讀取到的目錄中的所有文件名 */ const fs = require("fs"), path = require("path"); fs.readdir(__dirname + "/../11文件系統(tǒng)fs", (err, files) => { if (err) throw err; files.forEach(file => { let filePath = path.normalize(__dirname + "/" + file); fs.stat(filePath, (err, stats) => { if (stats.isFile()) { console.log(filePath + " is: " + "file"); } if (stats.isDirectory()) { console.log(filePath + " is: " + "dir"); } }) }) })3、流操作 3.1 創(chuàng)建讀取流
//fs.createReadStream(path, [options]) /** * path 文件路徑 * [options] flags:指定文件操作,默認"r",讀操作;encoding,指定讀取流編碼;autoClose, 是否讀取完成后自動關閉,默認true;start指定文件開始讀取位置;end指定文件開始讀結束位置 */ const fs = require("fs"); const rs = fs.createReadStream("./package.json", { flags: "r" }); rs.on("open", fd => console.log("開始讀取文件")); rs.on("data", data => { console.log(data.toString()); }) rs.on("end", function () { console.log("讀取文件結束") }); rs.on("close", function () { console.log("文件關閉"); }); rs.on("error", function (err) { console.error(err); });3.2 創(chuàng)建寫入流
//fs.createWriteStream(path, [options]) /** * path 文件路徑 * [options] flags:指定文件操作,默認"w",;encoding,指定讀取流編碼;start指定寫入文件的位置 */ /* ws.write(chunk, [encoding], [callback]); * chunk, 可以為Buffer對象或一個字符串,要寫入的數(shù)據(jù) * [encoding], 編碼 * [callback], 寫入后回調 */ /* ws.end([chunk], [encoding], [callback]); * [chunk], 要寫入的數(shù)據(jù) * [encoding], 編碼 * [callback], 寫入后回調 */ const fs = require("fs"); const ws=fs.createWriteStream("./test.txt",{flags:"w"}) const bf=Buffer.from("I Love Node"); ws.on("open", function () { console.log("文件流開啟") }); ws.on("close", function () { console.log("文件流關閉"); }); ws.on("error", function (err) { console.error(err); }); ws.write(bf,"utf8",(err,buffer)=>{ console.log("寫入完成") }) ws.end(" Bye");3.3 使用流復制文件
流復制文件就是創(chuàng)建一個讀取流和一個寫入流,將讀取流中的流出的數(shù)據(jù)用寫入流進行寫入
//使用流復制文件 const fs = require("fs"); const rs = fs.createReadStream("./package.json"); const ws = fs.createWriteStream("./package1.json"); rs.on("data", data => { ws.write(data); }) ws.on("open", function (fd) { console.log("要寫入的數(shù)據(jù)文件已經(jīng)打開,文件描述符是: " + fd); }); rs.on("end",()=>{ console.log("文件讀取完成"); ws.end("完成",()=>{ console.log("文件寫入完成"); }) })
關于WriteStream對象的write方法返回一個布爾類型,當緩存區(qū)中數(shù)據(jù)全部寫滿時,返回false;表示緩存區(qū)已經(jīng)寫滿,并將立即輸出到目標對象中。
一個例子測試返回值:
const fs = require("fs"); var ws = fs.createWriteStream(__dirname + "/test.txt",{flags:"w"}); for (var i = 0; i < 10000; i++) { var w_flag = ws.write(i.toString()); //當緩存區(qū)寫滿時,輸出false console.log(w_flag); }
一個例子當緩存區(qū)數(shù)據(jù)全部輸出時,觸發(fā)事件
const fs = require("fs"); const rs = fs.createReadStream("./ABoy.mp3"); const ws = fs.createWriteStream("./ABoy1.mp3"); rs.on("data", data => { let t = ws.write(data); if(!t){ console.log(t); } }) ws.on("drain", () => { console.log("系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。") })3.4 pipe管道用于流
上面使用一個讀取流額一個寫入流進行了一次文件的復制,還有另外一種方式就是在寫入流和讀取流之間建立一條管道,是讀取流中的數(shù)據(jù)通過管道源源不斷的流向寫入流,實現(xiàn)文件的復制。
const fs = require("fs"); const rs = fs.createReadStream("./ABoy.mp3"); const ws = fs.createWriteStream("./ABoy1.mp3"); rs.pipe(ws); rs.on("data", function (data) { console.log("數(shù)據(jù)可讀") }); rs.on("end", function () { console.log("文件讀取完成"); }); ws.on("drain", () => { console.log("系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。") }); ws.on("open", function (fd) { console.log("要寫入的數(shù)據(jù)文件已經(jīng)打開,文件描述符是: " + fd); });
CSDN 【Node文件系統(tǒng)fs模塊】同步更新
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88733.html
摘要:端輸入數(shù)據(jù)到端,對就是輸入流,得到的對象就是可讀流對就是輸出端得到的對象是可寫流。在中,這四種流都是的實例,它們都有事件,可讀流具有監(jiān)聽數(shù)據(jù)到來的事件等,可寫流則具有監(jiān)聽數(shù)據(jù)已傳給低層系統(tǒng)的事件等,和都同時實現(xiàn)了和的事件和接口。 原文地址在我的博客 node中的Buffer和Stream會給剛接觸Node的前端工程師們帶來困惑,原因是前端并沒有類似概念(or 有我們也沒意識到)。然而,...
摘要:回調函數(shù)提供兩個參數(shù)和,表示有沒有錯誤發(fā)生,是文件內(nèi)容。文件關閉第一個參數(shù)文件時傳遞的文件描述符第二個參數(shù)回調函數(shù)回調函數(shù)有一個參數(shù)錯誤,關閉文件后執(zhí)行。 showImg(//img.mukewang.com/5d3f890d0001836113660768.jpg); 人所缺乏的不是才干而是志向,不是成功的能力而是勤勞的意志。 —— 部爾衛(wèi) 文章同步到github博客:https:/...
摘要:表示當前正在執(zhí)行的腳本的文件名。默認編碼為模式為,為回調函數(shù),回調函數(shù)只包含錯誤信息參數(shù),在寫入失敗時返回。參數(shù)使用說明如下通過方法返回的文件描述符。 Node.js回調 Node.js異步編程的直接體現(xiàn)就是回調。 阻塞代碼: const fs = require(fs); let data = fs.readFileSync(input.txt); console.log(data...
摘要:為指定事件注冊一個監(jiān)聽器,接受一個字符串和一個回調函數(shù)。發(fā)射事件,傳遞若干可選參數(shù)到事件監(jiān)聽器的參數(shù)表。為指定事件注冊一個單次監(jiān)聽器,即監(jiān)聽器最多只會觸發(fā)一次,觸發(fā)后立刻解除該監(jiān)聽器。 1.Node.js 簡介 Node.js 其實就是借助谷歌的 V8 引擎,將桌面端的 js 帶到了服務器端,它的出現(xiàn)我將其歸結為兩點: V8 引擎的出色; js 異步 io 與事件驅動給服務器帶來極高...
閱讀 1860·2021-09-22 15:29
閱讀 3351·2019-08-30 15:44
閱讀 3558·2019-08-30 15:43
閱讀 1763·2019-08-30 13:48
閱讀 1489·2019-08-29 13:56
閱讀 2474·2019-08-29 12:12
閱讀 965·2019-08-26 11:35
閱讀 1053·2019-08-26 10:25