Node.js異步編程的直接體現就是回調。javascript
const fs = require("fs"); let data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("程序執行結束");
const fs = require("fs"); fs.readFile('input.txt',(error,data)=>{ if(error) return console.log(error); console.log(data.toString()); }); console.log("程序執行結束");
Node.js是單進程單線程應用程序,可是經過事件和回調支持併發,因此性能很是高。
進程:CPU執行任務的模塊。線程:模塊中的最小單元。java
Node.js使用事件驅動模型。
事件就是須要 eventEmitter.on 去綁定一個事件 經過 eventEmitter.emit 去觸發這個事件其次說的是 事件的 接收 和 發生 是分開的
node
代碼以下:git
// 引入events 模塊 const events = require('events'); // 建立 eventEmitter 對象 let eventEmitter = new events.EventEmitter(); // 這裏既可使用.on 也可使用 .addListener eventEmitter.on('dataReceived',(data) => { console.log(`接受的數據爲:${data}`); }); // 觸發 dataReceived 事件 eventEmitter.emit('dataReceived');
大多數時候咱們不會直接使用 EventEmitter,而是在對象中繼承它。包括 fs、net、 http 在內的,只要是支持事件響應的核心模塊都是 EventEmitter 的子類。github
若事件隊列中出現一個未綁定事件則觸發error事件,若未綁定 error事件則程序拋出異常結束執行 emitter.emit('error'); 程序會直接中斷,並拋出異常。web
該類用來建立一個專門存放二進制數據的緩存區。正則表達式
在v6.0之後,官方文檔裏面建議使用 Buffer.from() 接口去建立Buffer對象。
Buffer 實例通常用於表示編碼字符的序列,好比 UTF-8 、 UCS2 、 Base64 、或十六進制編碼的數據。 經過使用顯式的字符編碼,就能夠在 Buffer 實例與普通的 JavaScript 字符串之間進行相互轉換。編程
const buf = Buffer.from('hello','utf8'); // 輸出 hex 編碼後的內容 console.log(buff.toString('hex')); // 輸出 base64 編碼後的內容 console.log(buf.toString('base64'));
經過 from 和 allocation(n:分配)數組
// 建立一個長度爲 十、且用 0 填充的 Buffer。 const buf1 = Buffer.alloc(10); // 建立一個長度爲 十、且用 0x1 填充的 Buffer。 const buf2 = Buffer.alloc(10, 1); // 建立一個長度爲 十、且未初始化的 Buffer。 // 這個方法比調用 Buffer.alloc() 更快, // 但返回的 Buffer 實例可能包含舊數據, // 所以須要使用 fill() 或 write() 重寫。 const buf3 = Buffer.allocUnsafe(10); // 建立一個包含 [0x1, 0x2, 0x3] 的 Buffer。 // 若是是字符串會被 0 覆蓋 const buf4 = Buffer.from([1, 2, 3]); // 建立一個包含 UTF-8 字節 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。 const buf5 = Buffer.from('tést'); // 建立一個包含 Latin-1 字節 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。 const buf6 = Buffer.from('tést', 'latin1');
buf.write(string,[offset],[length],[encoding]);
參數描述:緩存
// 分配一個256字節的緩衝區 let buf = Buffer.alloc(256); let len = buf.write("www.baidu.com"); console.log(`寫入的字節數數爲:${len}`);
buf.toString([encoding],[start],[end]);
參數描述:
// 建立緩衝區並寫入26個小寫英文字母的ASCII碼 buf = Buffer.alloc(26); for (var i = 0 ; i < 26 ; i++) { buf[i] = i + 97; } console.log( buf.toString('ascii')); // 輸出: abcdefghijklmnopqrstuvwxyz console.log( buf.toString('ascii',0,5)); // 輸出: abcde console.log( buf.toString('utf8',0,5)); // 輸出: abcde console.log( buf.toString(undefined,0,5)); // 使用 'utf8' 編碼, 並輸出: abcde
buf.toJSON();
var buffer3 = Buffer.concat([buffer1,buffer2]);
buf.copy([targetBufffer],[targetStart],[sourceStart],{sourceEnd});
eg: buf2.copy(buf1,2) // 將buf2插入到buf1指定的位置上
Stream 是一個抽象接口,Node 中有不少對象實現了這個接口。例如,對http 服務器發起請求的request 對象就是一個 Stream,還有stdout(標準輸出)。
全部的Stream對象繼承了 EventEmitter 類,因此擁有如下事件:
const fs = require("fs"); let data = ""; // 建立可讀流 let readStream = fs.createReadStream('input.txt'); readStream.on('data',(chunk)=>{ data += chunk; }) readStream.on('end',()=>{ console.log(data); }) ...
var fs = require("fs"); var data = '百度官網地址:www.baidu.com'; // 建立一個能夠寫入的流,寫入到文件 output.txt 中 var writerStream = fs.createWriteStream('output.txt'); // 使用 utf8 編碼寫入數據 writerStream.write(data,'UTF8'); // 標記文件末尾 writerStream.end(); // 處理流事件 --> data, end, and error writerStream.on('finish', ()=> { console.log("寫入完成。"); });
能夠實現大文件的複製。
const fs = require('fs'); let rs = fs.createReadStream('input.txt'); let ws = fs.createWriteStream('output.txt'); // 管道讀寫操做 // 讀取input.txt,將內容寫入到output.txt文件中 rs.pipe(ws);
鏈式是經過鏈接輸出流到另一個流並建立多個流操做鏈的機制。鏈式流通常用於管道操做。
接下來咱們就是用管道和鏈式來壓縮和解壓文件。
var fs = require("fs"); var zlib = require('zlib'); // 壓縮 input.txt 文件爲 input.txt.gz fs.createReadStream('input.txt') .pipe(zlib.createGzip()) .pipe(fs.createWriteStream('input.txt.gz')); console.log("文件壓縮完成。");
Node.js 中的全局對象是 global,全部全局變量(除了 global 自己之外)都是 global 對象的屬性。
__filename :表示當前正在執行的腳本的文件名。(輸出文件所在的絕對路徑)
__ __dirnname __:表示當前執行腳本呢所在的目錄。
__ process __:它用於描述當前Node.js 進程狀態的對象。
util是一個node。js核心模塊,提供經常使用的函數的集合。
Node.js 提供一組標準的文件操做API。
var fs = require("fs");
fs.open(path,flags,[mode],callback);
如下爲經過異步模式獲取文件信息的語法格式:
fs.stat(path,callback) // 帶兩個參數:(err,stats)
能夠經過stats類中的提供方法判斷文件的相關屬性。
如下爲異步模式下寫入文件的語法格式:
fs.writeFile(file, data,[options], callback)
若是文件存在,該方法寫入的內容會覆蓋舊的文件內容。
參數使用說明以下:
如下爲異步模式下讀取文件的語法格式:
fs.read(fd, buffer, offset, length, position, callback)
該方法使用了文件描述符來讀取文件。
參數使用說明以下:
fs.close(fd,callback)
打開文件,讀取文件,關閉文件示例代碼:
var fs = require("fs"); var buf = new Buffer(1024); console.log("準備打開文件!"); fs.open('input.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("文件打開成功!"); console.log("準備讀取文件!"); fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){ if (err){ console.log(err); } // 僅輸出讀取的字節 if(bytes > 0){ console.log(buf.slice(0, bytes).toString()); } // 關閉文件 fs.close(fd, function(err){ if (err){ console.log(err); } console.log("文件關閉成功"); }); }); });
fs.unlink(path,callback);
fs.mkdir(path,[mode],callback);
fs.readdir(path,callback); // callback(err,files[文件列表])
fs.rmdir(path,callback);
os模塊提供了一些基本的系統操做函數。
var os = require("os"); // CPU 的字節序 console.log('endianness : ' + os.endianness()); // 操做系統名 console.log('type : ' + os.type()); // 操做系統名 console.log('platform : ' + os.platform()); // 系統內存總量 console.log('total memory : ' + os.totalmem() + " bytes."); // 操做系統空閒內存量 console.log('free memory : ' + os.freemem() + " bytes.");
var path = require("path"); // 格式化路徑 console.log('normalization : ' + path.normalize('/test/test1//2slashes/1slash/tab/..')); // normalization : /test/test1/2slashes/1slash // 鏈接路徑 console.log('joint path : ' + path.join('/test', 'test1', '2slashes/1slash', 'tab', '..')); // joint path : /test/test1/2slashes/1slash // 轉換爲絕對路徑 console.log('resolve : ' + path.resolve('main.js')); // resolve : /web/com/1427176256_27423/main.js // 路徑中文件的後綴名 console.log('ext name : ' + path.extname('main.js')); // ext name : .js
dns.lookup(hostname,[options(4|6)],callback); // 解析域名
var dns = require('dns'); dns.lookup('www.github.com', function onLookup(err, address, family) { console.log('ip 地址:', address); dns.reverse(address, function (err, hostnames) { if (err) { console.log(err.stack); } console.log('反向解析 ' + address + ': ' + JSON.stringify(hostnames)); }); });