前沿:核心模塊二主要是和流相關的部分,固然要想給這一塊有清楚的瞭解,你須要對核心模塊(一)中的內容有一些瞭解。前端
fs模塊的常見方法(全部的讀方法,文件必須存在,不存在就會報錯,全部的寫方法,若是文件不存在,則建立該文件):node
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);
複製代碼
const fs=require('fs');
//會覆蓋文件原有內容
//fs.writeFile('./2.txt','123',{encoding: 'utf8'},(err) => {
// console.log('write OK');
//})
fs.writeFileSync('./3.txt','456');
複製代碼
const fs=require('fs');
//writeFile flags=w 寫入,若是文件已經存在,則刪除掉文件後再寫入
//fs.writeFile('./4.txt','789',{flag:'a'});
//給文件追加內容,不會覆蓋原有內容
fs.appendFile('./4.txt','789');
複製代碼
以上三個方法的弊端:都是將文件總體讀出或者寫入。web
fs.open(src, 'r', (err,fd)) //第一個參數表示文件,第二個表示什麼方式(r, r+, w, w+, a, a+), 第三個是回調,其中 fd是文件描述符
複製代碼
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());
});
複製代碼
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('關閉文件');
});
});
});
複製代碼
fs.createReadStream()面試
fs.fsync()瀏覽器
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 時,則會返回 false。
if (!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
複製代碼
//讀取文件的狀態;不建議在調用 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
})
複製代碼
let fs = require('fs');
fs.access('./1.txt', (err) => {
console.log(err)
})
複製代碼
//建立目錄 建立目錄的時候必定要注意 父目錄必定要存在
let fs = require('fs');
fs.mkdir('./a/b', (err) => { //若是a目錄不存在 則會報錯
console.log(err)
})
複製代碼
//刪除目錄 同理 若是a目錄不是空的,須要刪除a裏面的從裏面往外一層一層刪除,不然報錯,directory not empty
let fs = require('fs');
fs.rmdir('./a', (err) => {
console.log(err)
})
複製代碼
//傳輸層 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
複製代碼
//常見用法
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
相關內容: