1.Buffer緩沖器
1.Buffer是什么?
- 1.它是一個類似于數(shù)組的對象,用于存儲數(shù)據(jù)(存儲的是二進(jìn)制數(shù)據(jù))。
- 2.Buffer的效率很高,存儲和讀取很快,直接對計(jì)算機(jī)的內(nèi)存進(jìn)行操作。
- 3.Buffer的大小一旦確定了,不可修改。
- 4.每個元素占用內(nèi)存的大小為1字節(jié)。
- 5.Buffer是Node中的非常核心的模塊,無需下載、無需引入即可使用
2.進(jìn)制:
- 十六進(jìn)制:00 ----- ff
- 十進(jìn)制: 00 ----- 255
- 二進(jìn)制: 00000000 ------- 11111111
3.換算
- 8 bit(位) = 1 byte(字節(jié))
- 1024byte = 1KB
- 1024Kb = 1MB
- 1024Mb = 1Gb
- 1024GB = 1TB
- 1024TB = 1PB
//1.將一個字符串存入Buffer中
let str = 'HELLO WORLD'
let buf = Buffer.from(str)
console.log(buf) //<Buffer 48 45 4c 4c 4f>
//2.alloc這種方式去創(chuàng)建Buffer實(shí)例---效率一般
let buf2 = Buffer.alloc(10)
console.log(buf2) //<Buffer 00 00 00 00 00 00 00 00 00 00> 00占位代表(空內(nèi)存)
//3.allocUnsafe這種方式去創(chuàng)建Buffer實(shí)例---效率很好,但是存在一些安全問題
let buf3 = Buffer.allocUnsafe(10)
console.log(buf3) //<Buffer 0e 00 00 00 06 02 00 00 06 00> 使用沒有被引用的內(nèi)存,可能殘留一些信息
//4.使用new關(guān)鍵字創(chuàng)建一個Buffer實(shí)例(即將被棄用)-----效率很低
let buf4 = new Buffer(10)
console.log(buf4) // <Buffer 00 00 00 00 00 00 00 00 00 00>
2.Node中的文件操作(寫入)
Node中的文件系統(tǒng):
- 在NodeJs中有一個文件系統(tǒng),所謂的文件系統(tǒng),就是對計(jì)算機(jī)中的文件進(jìn)行增刪改查等操作。
- 在NodeJs中,給我們提供了一個模塊,叫做fs模塊,專門用戶操作文件。
- fs模塊是Node的核心模塊,使用的時候,要引入進(jìn)來,不用下載安裝。
簡單文件寫入(異步):
fs.writeFile(file, data[, options], callback)
--file:文件路徑+文件名
--data:要寫入的數(shù)據(jù)
--options:配置選項(xiàng)(可選參數(shù))
--flag:打開文件要進(jìn)行的操作,默認(rèn)是w
'w':直接寫入
'a':追加
--mode:文件權(quán)限的限制,默認(rèn)值是0o666
--0o111:文件可被執(zhí)行
--0o222:文件可被寫入
--0o444:文件可被讀取
--encoding:默認(rèn)值utf8
--callback:回調(diào)函數(shù)
--err
備注:在Node中有一個設(shè)計(jì)原則:錯誤優(yōu)先。
不足之處:簡單文件寫入是一次性把所有要寫入的數(shù)據(jù)加載到內(nèi)存中,對于比較大的文件容易產(chǎn)生內(nèi)存溢出,適用于較小的文件寫入。
//1.引入fs模塊
let fs = require('fs')
//2.進(jìn)行簡單文件寫入
fs.writeFile('./720.txt','哈哈',{
flag:'w',
mode:0o666,
encoding:'utf8'
},(err)=>{
if(!err){
console.log('文件寫入成功了!')
}else{
console.log(err)
}
})
流式文件寫入:
fs.createWriteStream(path[, options])
--path:文件路徑+文件名
--options:配置對象(可選)
--flags:打開文件要進(jìn)行的操作,默認(rèn)是w
'w':直接寫入
'a':追加
--mode:文件權(quán)限的限制,默認(rèn)值是0o666
--0o111:文件可被執(zhí)行
--0o222:文件可被寫入
--0o444:文件可被讀取
--encoding:默認(rèn)值utf8
--fd:文件的唯一標(biāo)識。(了解)
--autoClose:自動關(guān)閉,當(dāng)數(shù)據(jù)操作完畢,自動關(guān)閉文件,默認(rèn)是true
--start:文件寫入的起始位置
//1.引入fs模塊
let fs = require('fs')
//2.創(chuàng)建一個可寫流
let ws = fs.createWriteStream('./demo.txt',{
start:20
})
//只要使用了流,必須給流加監(jiān)聽
ws.on('open',()=>{
console.log('可寫流打開了')
})
ws.on('close',()=>{
console.log('可寫流關(guān)閉了')
})
//3.開始寫入數(shù)據(jù)
ws.write('馬上晚上放學(xué)了\n')
ws.write('我餓了\n')
ws.write('餓了你就忍著吧\n')
ws.close() //如果用的是Node的8版本一下(包含8版本),用此種方式關(guān)閉流,容易造成數(shù)據(jù)丟失。
//ws.end()
3.Node中的文件操作(讀取)
簡單文件讀取:
fs.readFile(path[, options], callback)
--path:文件路徑+文件名
--options:配置對象
--encoding:文件編碼
--flag:打開文件要進(jìn)行的操作
--callback:回調(diào)函數(shù)
--err:錯誤對象
--data:數(shù)據(jù)
//1.引入fs模塊
let fs = require('fs')
//2.簡單文件讀取
fs.readFile('./music.mp3',(err,data)=>{
if(!err){
//思考?為什么讀取出來的是Buffer類型(看不懂),因?yàn)樽x取出來的數(shù)據(jù)不一定是文本,可能是媒體文件。
//console.log(data.toString())
fs.writeFile('../demo.mp3',data,(err)=>{
if(!err){
console.log('ok')
}else{
console.log(err)
}
})
}else{
console.log(err)
}
})
流式文件讀?。?/h4>
fs.createReadStream(path[, options])
--path:文件路徑+文件名
--options:配置對象(可選)
--flags:打開文件要進(jìn)行的操作,默認(rèn)是w
'w':直接寫入
'a':追加
--mode:文件權(quán)限的限制,默認(rèn)值是0o666
--0o111:文件可被執(zhí)行
--0o222:文件可被寫入
--0o444:文件可被讀取
--encoding:默認(rèn)值utf8
--start:讀取的起始點(diǎn)
--end:讀取的結(jié)束點(diǎn)
--highWaterMark:每次讀取數(shù)據(jù)的大小 默認(rèn)值是:64 * 1024
//1.引入fs模塊
let fs = require('fs')
//2.創(chuàng)建一個可讀流,對于可讀流來說,當(dāng)沒有數(shù)據(jù)可繼續(xù)讀取的時候,會自動關(guān)閉可讀流。
let rs = fs.createReadStream('./music.mp3',{
//start:2000,
//end:90000,
highWaterMark:1024 * 1024
})
let ws = fs.createWriteStream('../demo.mp3')
//使用了流,必須給流加監(jiān)聽(為了確保每個流都能夠在使用完畢后關(guān)閉)
rs.on('open',()=>{
console.log('可讀流打開了')
})
rs.on('close',()=>{
console.log('可讀流關(guān)閉了')
ws.close()
})
ws.on('open',()=>{
console.log('可寫流打開了')
})
ws.on('close',()=>{
console.log('可寫流關(guān)閉了')
})
//3.給可讀流綁定一個data事件,會自動觸發(fā)流讀取文件
rs.on('data',(data)=>{
//輸出Buffer實(shí)例的length的時候,輸出的不是長度,輸出的是占用內(nèi)存的大小
//console.log(data.length)
ws.write(data)
})
關(guān)于環(huán)境變量的說明
fs.createReadStream(path[, options])
--path:文件路徑+文件名
--options:配置對象(可選)
--flags:打開文件要進(jìn)行的操作,默認(rèn)是w
'w':直接寫入
'a':追加
--mode:文件權(quán)限的限制,默認(rèn)值是0o666
--0o111:文件可被執(zhí)行
--0o222:文件可被寫入
--0o444:文件可被讀取
--encoding:默認(rèn)值utf8
--start:讀取的起始點(diǎn)
--end:讀取的結(jié)束點(diǎn)
--highWaterMark:每次讀取數(shù)據(jù)的大小 默認(rèn)值是:64 * 1024
//1.引入fs模塊
let fs = require('fs')
//2.創(chuàng)建一個可讀流,對于可讀流來說,當(dāng)沒有數(shù)據(jù)可繼續(xù)讀取的時候,會自動關(guān)閉可讀流。
let rs = fs.createReadStream('./music.mp3',{
//start:2000,
//end:90000,
highWaterMark:1024 * 1024
})
let ws = fs.createWriteStream('../demo.mp3')
//使用了流,必須給流加監(jiān)聽(為了確保每個流都能夠在使用完畢后關(guān)閉)
rs.on('open',()=>{
console.log('可讀流打開了')
})
rs.on('close',()=>{
console.log('可讀流關(guān)閉了')
ws.close()
})
ws.on('open',()=>{
console.log('可寫流打開了')
})
ws.on('close',()=>{
console.log('可寫流關(guān)閉了')
})
//3.給可讀流綁定一個data事件,會自動觸發(fā)流讀取文件
rs.on('data',(data)=>{
//輸出Buffer實(shí)例的length的時候,輸出的不是長度,輸出的是占用內(nèi)存的大小
//console.log(data.length)
ws.write(data)
})
什么是環(huán)境變量?
- 定義:是系統(tǒng)執(zhí)行命令時候會讀取的變量
- 分為兩種:系統(tǒng)環(huán)境變量、用戶環(huán)境變量
- 配置方法:我的電腦 -> 高級系統(tǒng)設(shè)置 -> 環(huán)境變量 ->用戶環(huán)境變量
- 配置原則:優(yōu)先修改用戶環(huán)境變量,如不能完成目的,再修改系統(tǒng)環(huán)境變量。