帶你一塊兒擼一遍 nodejs 經常使用核心模塊(二)

前沿:核心模塊二主要是和流相關的部分,固然要想給這一塊有清楚的瞭解,你須要對核心模塊(一)中的內容有一些瞭解。前端

fs模塊

fs模塊的常見方法(全部的讀方法,文件必須存在,不存在就會報錯,全部的寫方法,若是文件不存在,則建立該文件):node

  1. fs.readFile() --- fs.readFileSync()
let fs=require('fs');
//是把整個文件做爲一個總體
fs.readFile('./1.txt',{encoding:'utf8'},function (err,data) {
	console.log(err);
	console.log(data);
});
//同步方法是沒有回調函數的
let result=fs.readFileSync('./1.txt',{encoding: 'utf8'});
console.log(result);
複製代碼
  1. fs.writeFile() ---fs.weiteFileSync()
const fs=require('fs');
//會覆蓋文件原有內容
//fs.writeFile('./2.txt','123',{encoding: 'utf8'},(err) => {
//	console.log('write OK');
//})
fs.writeFileSync('./3.txt','456');
複製代碼
  1. fs.appendFile()
const fs=require('fs');
//writeFile flags=w 寫入,若是文件已經存在,則刪除掉文件後再寫入
//fs.writeFile('./4.txt','789',{flag:'a'});
//給文件追加內容,不會覆蓋原有內容
fs.appendFile('./4.txt','789');
複製代碼

以上三個方法的弊端:都是將文件總體讀出或者寫入。web

  1. fs.open()
fs.open(src, 'r', (err,fd))    //第一個參數表示文件,第二個表示什麼方式(r, r+, w, w+, a, a+), 第三個是回調,其中 fd是文件描述符
複製代碼
  1. fs.read() //將內容放到內存中
let buffer=Buffer.alloc(6);//[0,1,2,3,4,5]
fs.read(fd,buffer,0,3,3,(err,bytesRead) => {   //文件描述符,buffer,buffer0的位置,buffer的長度,文件讀取的位置,
//回調 bytesRead表示實際字節
    console.log(buffer.toString());
});
複製代碼
  1. fs.write()
let buffer=Buffer.from('每天向上');//[0,1,2,3,4,5,6,7,8,9,10,11]
//fd buffer offset
fs.write(fd,buffer,3,6,3,(err,bytesWritten) => { //文件描述符,buffer,buffer起始位置,buffer長度,文件寫入位置,
//回調 bytesWritten表示實際字節
	console.log(err);
	fs.fsync(fd,(err) => {
		fs.close(fd,(err) => {
			console.log('關閉文件');
		});
	});
});
複製代碼
  1. fs.createReadStream()面試

  2. fs.fsync()瀏覽器

  3. fs.createWriteStream()bash

來一個小例子,有助於理解websocket

// pipe
let fs = require('fs');
let rs = fs.createReadStream('./1.txt',{
    highWaterMark:1
})
let ws = fs.createWriteStream('./5.txt',{
    highWaterMark:2
})
let index = 1;
rs.on('data', (data) => {
    console.log(index++)
    let flag = ws.write(data);    // 當內部的可寫緩衝的總大小小於 highWaterMark 設置的閾值時,
    //調用 writable.write() 會返回 true。 一旦內部緩衝的大小達到或超過 highWaterMark 時,則會返回 falseif (!flag) {     //內部緩衝超過highWaterMark
        rs.pause()
    }
})
let wsIndex = 1;
ws.on('drain', () => {
    console.log('ws'+wsIndex++)
    rs.resume()
})
// 1 2 ws1 3 4 ws2 5 6 ws3
複製代碼
  1. fs.stat()
//讀取文件的狀態;不建議在調用 fs.open() 、fs.readFile() 或 fs.writeFile() 以前使用 fs.stat() 檢查一個文件是否存在。
//做爲替代,用戶代碼應該直接打開/讀取/寫入文件,當文件無效時再處理錯誤。
 //若是要檢查一個文件是否存在且不操做它,推薦使用 fs.access()。
 let fs = require('fs');
fs.stat('./1.txt', (err, data) => {
    console.log(data)    //列舉幾個經常使用的屬性 size,ctime,birthtime,mtime
})
複製代碼
  1. fs.access() 文件是否存在
let fs = require('fs');
fs.access('./1.txt', (err) => {
    console.log(err)
})
複製代碼
  1. fs.mkdir()
//建立目錄 建立目錄的時候必定要注意 父目錄必定要存在
let fs = require('fs');
fs.mkdir('./a/b', (err) => {   //若是a目錄不存在 則會報錯
    console.log(err)
})
複製代碼
  1. fs.rmdir()
//刪除目錄 同理 若是a目錄不是空的,須要刪除a裏面的從裏面往外一層一層刪除,不然報錯,directory not empty
let fs = require('fs');
fs.rmdir('./a', (err) => {
    console.log(err)
})
複製代碼

TCP模塊

//傳輸層 http websocket都是基於tcp tcp是一個可讀可寫流

// 傳輸層  http websocket (應用起來基本同樣)
let net = require('net');

// 套接字
let server = net.createServer();
// 連接時會執行此方法,每次連接都會產產生一個socket對象
// http規定的頭 設置一些頭
// socket是一個可讀可寫的流 Duplex
server.on('connection',function(socket){
    // socket 沒有規則 咱們能夠用tcp 模擬http
    socket.setEncoding('utf8');
    socket.on('data',function(data){
        console.log(data);
    });
    //模擬
    socket.write(`
HTTP/1.1 200 ok
Content-Length: 5

hello
    `);
});
server.listen(3000);
//當咱們打開瀏覽器 localhost:3000時 能夠看到hello
複製代碼

http模塊

//常見用法
var http=require("http");

http.createServer(function(req,res){
    res.writeHead(200,{
        "content-type":"text/plain"
    });
    res.write("hello nodejs");
    res.end();
}).listen(3000);
//在瀏覽器中輸入 localhost:3000 咱們能夠看到hello nodejs
複製代碼

以上就是nodejs的經常使用核心模塊的一部分,由於涉及的內容比較多並無深刻進去,其實每一個部分均可以展開裏面有不少知識,不少深刻的知識我本人也不是很瞭解,但願上面的一些核心內容可以幫助到你,固然有不少不足之處但願朋友們提出指正。也但願和各位朋友一塊兒學習分享!前端工程師

後記:app

本文涉及到的流更加深刻一點的能夠看socket

相關內容:

相關文章
相關標籤/搜索