node系統(tǒng)模塊

node.js系統(tǒng)模塊

1.file system 文件系統(tǒng) fs

使用:

var fs = require(‘fs’);

2.fs.Dirent 類

1)dirent.isDirectory() 判斷是否是一個文件夾

2)dirent.isFile() 判斷是否是一個文件

3)dirent.name 返回文件或者文件夾的名稱

direct 是通過fs獲取到的一個文件對象

fs.readdir('node_modules',{withFileTypes:true},function(err,dir){
    if(err){
        console.log('something error');
    }else{
        for(var i in dir){

            // console.log(dir[i],dir[i].isDirectory());
            console.log(dir[i],dir[i].isFile());
        }
    }
});

image

3.fs.FSWatcher 類

成功調(diào)用 fs.watch() 方法將返回一個新的 fs.FSWatcher 對象衣形。所有 fs.FSWatcher 對象每當修改指定監(jiān)視的文件亩进,就會觸發(fā) 'change' 事件鸟赫。

1) change

當監(jiān)視的目錄或文件中發(fā)生更改時觸發(fā)。

2) close

當監(jiān)視器停止監(jiān)視更改時觸發(fā)。 關(guān)閉的 fs.FSWatcher 對象在事件處理函數(shù)中不再可用中姜。

watcher.close() 用于關(guān)閉文件監(jiān)視

給定的 fs.FSWatcher 停止監(jiān)視更改椭符。 一旦停止,則 fs.FSWatcher 對象將不再可用贸诚。

3) error

當監(jiān)視文件時發(fā)生錯誤時觸發(fā)方庭。 發(fā)生錯誤的 fs.FSWatcher 對象在事件處理函數(shù)中不再可用。

4.fs.readStream 類

成功調(diào)用 fs.createReadStream() 將返回一個新的 fs.ReadStream 對象酱固。

1) open

當 fs.ReadStream 的文件描述符打開時觸發(fā)

3) ready

'open' 事件之后立即觸發(fā)械念。

4) close

當 fs.ReadStream 的底層文件描述符已關(guān)閉時觸發(fā)。

fs.ReadStream.close()   //關(guān)閉讀取流

5.fs.stats 類

image
image

一运悲、緩存區(qū)龄减、文件系統(tǒng)、路徑 Day03

1.課程介紹

  • Buffer緩存區(qū)(了解)
  • fs文件模塊(了解)
  • fs讀取文件(掌握)
  • fs寫文件(掌握)
  • fs流讀寫方式(掌握)
  • fs管道方式(掌握)
  • zlib文件壓縮模塊(掌握)
    1班眯、path路徑(掌握)
    2希停、url模塊(掌握)

2.Buffer緩存區(qū)

2.1.Buffer基本概念

JavaScript 語言自身只有字符串數(shù)據(jù)類型,沒有二進制數(shù)據(jù)類型署隘。二進制可以存儲電腦中任何數(shù)據(jù)(比如:一段文本宠能、一張圖片、一個硬盤磁餐,應該說電腦中所有的數(shù)據(jù)都是二進制违崇。)
緩存區(qū)就是一個臨時的內(nèi)存區(qū)域,用于存儲字節(jié)碼數(shù)據(jù)诊霹。
NodeJs是服務端在處理像TCP(網(wǎng)絡)流或文件流時羞延,必須使用到二進制數(shù)據(jù)。因此在 Node.js中畅哑,定義了一個 Buffer 類肴楷,該類用來創(chuàng)建一個專門存放二進制數(shù)據(jù)的緩存區(qū)。

2.2.Buffer創(chuàng)建

Buffer 對象可以通過多種方式來創(chuàng)建荠呐。

2.2.1.方法 1

創(chuàng)建長度為 10 字節(jié)(1kb=1024byte 1byte=8bit)的 Buffer 實例:

var buf = new Buffer(10);
注意:創(chuàng)建緩存區(qū)時必須指定大小赛蔫。

2.2.2.方法 2

通過給定的數(shù)組創(chuàng)建 Buffer 實例:

//2 創(chuàng)建指定字符的緩存區(qū)(可以是字符對應的ASICC編碼的數(shù)字)
var bf2=new Buffer([97,61,62,63,122]);    97: a   122:z
console.log(bf2,bf2.toString()); 

注意:只能存數(shù)字,不能存字符串

2.2.3.方法 3

通過一個字符串來創(chuàng)建 Buffer 實例:

var buf = new Buffer("www.itsource.com", "utf-8");

utf-8 是默認的編碼方式泥张,此外它同樣支持以下編碼:"ascii", "utf8", "utf16le", "ucs2", "base64" 和 "hex"呵恢。

UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼。

擴展知識:位媚创、字節(jié)渗钉、進制、編碼方式(詳解文章末尾)

2.3.Buffer寫入內(nèi)容

語法
buf.write(string[, offset[, length]][, encoding])

參數(shù)
參數(shù)描述如下:
string - 寫入緩沖區(qū)的字符串。
offset - 緩沖區(qū)開始寫入的索引值鳄橘,默認為 0 声离。
length - 寫入的字節(jié)數(shù),默認為 buffer.length
encoding - 使用的編碼瘫怜。默認為 'utf8' 术徊。

返回值
返回實際寫入的大小。如果 buffer 空間不足鲸湃, 則只會寫入部分字符串赠涮。

實例:

var buf = new Buffer(256);
len = buf.write("www.itsource.com");
console.log("寫入字節(jié)數(shù) : "+  len);

2.4.Buffer讀取內(nèi)容(轉(zhuǎn)換為字符串)

語法:
讀取 Node 緩沖區(qū)數(shù)據(jù)的語法如下所示:
buf.toString([encoding[, start[, end]]])

參數(shù):
參數(shù)描述如下:
encoding - 使用的編碼。默認為 'utf8' 暗挑。
start - 指定開始讀取的索引位置笋除,默認為 0。
end - 結(jié)束位置炸裆,默認為緩沖區(qū)的末尾垃它。

返回值:
解碼緩沖區(qū)數(shù)據(jù)并使用指定的編碼返回字符串。

var buf = new Buffer([97,98,99]);
console.log(buf.toString());

var s = “qq”;
s+=buf;//轉(zhuǎn)換為字符串
console.log(s);

2.5.Buffer拷貝

拷貝一個Buffer的某一段到操作對象中晒衩。

語法
源.copy(目標緩存區(qū))
buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])

參數(shù)
參數(shù)描述如下:
targetBuffer - 要拷貝的 Buffer 對象嗤瞎。
targetStart - 數(shù)字, 可選, 默認: 0
sourceStart - 數(shù)字, 可選, 默認: 0
sourceEnd - 數(shù)字, 可選, 默認: buffer.length

返回值:
沒有返回值。

實例:

var buffer1 = new Buffer('ABC');
// 拷貝一個緩沖區(qū)
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log("buffer2 content: " + buffer2.toString());

3.fs文件基本操作

文件系統(tǒng)模塊fs (file system)听系,可以對文件和文件夾進行讀取贝奇、寫入、刪除等操作靠胜。

3.1.fs模塊

var fs = require("fs"); //引入fs 系統(tǒng)文件模塊掉瞳,對文件進行操作.

Node.js 文件系統(tǒng)(fs 模塊)模塊中的方法均有異步和同步版本,例如讀取文件內(nèi)容的函數(shù)有異步的 fs.readFile() 和同步的 fs.readFileSync()浪漠。

3.2.文件讀取

var fs = require("fs");     //引入fs 系統(tǒng)文件模塊陕习,對文件進行操作.

// 異步讀取
fs.`readFile`('input.txt', function (err, data) {
   if (err) {
       return console.error(err);
   }
   console.log("異步讀取: " + data.toString());
});

// 同步讀取
var data = fs.`readFileSync`('input.txt');
console.log("同步讀取: " + data.toString());
console.log("程序執(zhí)行完畢。");

案例:
文件讀戎吩浮:

//文件的讀操作
//異步操作
//readFIle

 var fs = require('fs');
 /*
 console.log(111);
 fs.readFile('./03.json',function(err,data){
     //正確  err == nunll , data ==數(shù)據(jù)
     //錯誤  err == 錯誤信息 该镣,data == undefined
     console.log(333);

     if(err){
         console.log(err);
     }else{
         console.log(data.toString());

     }
 })

 console.log(222);

 */

 //123 李茂
 //132 張振

 //同步操作  幾乎所有的文件操作函數(shù)都具有一個同步操作的函數(shù),這個函數(shù)在后面添加了Sync,而且同步操作的函數(shù)是沒有回調(diào)函數(shù)的

 var file = fs.readFileSync('03.json');
 console.log(file.toString());

異步操作:

image

知識點:
定時器、延時器都是異步的操作
//js異步的最小時間
//setTimeout的最短時間間隔是4毫秒响谓;
// setInterval的最短間隔時間是10毫秒
同步操作

image

知識點:
同步操作 幾乎所有的文件操作函數(shù)都具有一個同步操作的函數(shù),這個函數(shù)在后面添加了Sync,而且同步操作的函數(shù)是沒有回調(diào)函數(shù)的

3.3.文件信息

以下為通過異步模式獲取文件信息的語法格式:
fs.stat(path, callback)

參數(shù):
參數(shù)使用說明如下:
path - 文件路徑损合。
callback - 回調(diào)函數(shù),帶有兩個參數(shù)如:(err, stats), stats 是 fs.Stats 對象娘纷。
fs.stat(path)執(zhí)行后嫁审,會將stats類的實例返回給其回調(diào)函數(shù)±稻В可以通過stats類中的

使用方法:

/*
 *獲取文件信息:
*fs.stat('文件名',function(err,stats){
    *stats :是一個包含了文件信息的對象
    *.size 文件大小
    *.mtime 文件最后一次修改時間
    *.isFile()  判斷是否是一個文件
    *.isDirectory() 判斷是否是一個文件夾
 *  })
 */

判斷是否為文件:
var fs = require('fs');
fs.stat('./my.txt', function (err, stats) {
        console.log("文件信息對象的屬性",stats);
        console.log("文件大小byte",stats.size);
        console.log("是否是文件",stats.isFile());
        console.log("是否是目錄",stats.isDirectory());
});

3.4.fs寫文件

以下為異步模式下寫入文件的語法格式:
fs.writeFile(filename, data[, options], callback)

如果文件存在律适,該方法寫入的內(nèi)容會覆蓋舊的文件內(nèi)容。

參數(shù)
參數(shù)使用說明如下:
path - 文件路徑。
data - 要寫入文件的數(shù)據(jù)捂贿,可以是 String(字符串) 或 Buffer(流) 對象纠修。
options - 該參數(shù)是一個對象,包含 {encoding, mode, flag}厂僧。默認編碼為 utf8, 模式為 0666 分瘾, flag 為 'w'
callback - 回調(diào)函數(shù),回調(diào)函數(shù)只包含錯誤信息參數(shù)(err)吁系,在寫入失敗時返回。

實例
接下來我們創(chuàng)建 file.js 文件白魂,代碼如下所示:

var fs = require("fs");
console.log("準備寫入文件");
fs.writeFile('input.txt', '我是通過寫入的文件內(nèi)容汽纤!',  function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("數(shù)據(jù)寫入成功!");
});

//先讀取并保留福荸,然后加入新的數(shù)據(jù)
fs.readFile("02fileTest.txt",function(err,data){
    if(err){
        throw err;
    }
    else{
        var oldContent=data;
        fs.writeFile("02fileTest.txt",oldContent+",此消息不真實蕴坪,是假的!>慈瘛1炒!",function(err){
            if(err){
                throw err;
            }
            else{
                console.log("文件追加寫入成功Lǘ帷>毒痢!");
            }
        });
    }
});

3.5.fs刪除文件

語法
以下為刪除文件的語法格式:
fs.unlink(path, callback)

參數(shù)
參數(shù)使用說明如下:
path - 文件路徑颤介。
callback - 回調(diào)函數(shù)梳星,沒有參數(shù)。

實例

var fs = require("fs");

console.log("準備刪除文件滚朵!");
fs.unlink('./my.txt', function(err) {
   if (err) {
       return ;
   }
   console.log("文件刪除成功冤灾!");
});

3.6.fs獲取目錄中的文件

//獲取當前目錄下面所有的文件及文件夾(列表--數(shù)組)
fs.readdir(".",function(err,files){
    console.log(files);
});

fs.readdir("..",function(err,files){
    console.log(files);
});

3.7.fs創(chuàng)建文件夾

語法
以下為創(chuàng)建文件夾的語法格式:
fs.mkdir(path, callback)
參數(shù)
參數(shù)使用說明如下:
path - 文件夾路徑。
callback - 回調(diào)函數(shù)辕近,沒有參數(shù)韵吨。

var fs = require(“fs”);
fs.mkdir('./aaa', function(err) {
   if (err) {
       return ;
   }
   console.log("文件夾創(chuàng)建成功!");
});

3.8.fs刪除空文件夾

語法
以下為刪除文件的語法格式:
fs.rmdir(path, callback)
參數(shù)
參數(shù)使用說明如下:
path - 文件夾路徑移宅。
callback - 回調(diào)函數(shù)归粉,沒有參數(shù)。

var fs = require(“fs”);
fs.rmdir('./aaa', function(err) {
   if (err) {
       return ;
   }
   console.log("文件夾刪除成功吞杭!");
});

4.fs流讀寫方式

前面我們已經(jīng)學習了如何使用fs模塊中的readFile方法盏浇、readFileSync方法讀取文件中內(nèi)容,及如何使用fs模塊中的writeFile方法芽狗、writeFileSync方法向一個文件寫入內(nèi)容绢掰。

用readFile方法或readFileSync方法讀取文件內(nèi)容時,Node.js首將文件內(nèi)容完整地讀入緩存區(qū),再從該緩存區(qū)中讀取文件內(nèi)容滴劲。在使用writeFile方法或writeFileSync方法寫入文件內(nèi)容時攻晒,Node.js首先將該文件內(nèi)容完整地讀人緩存區(qū),然后再一次性的將緩存區(qū)中內(nèi)容寫入到文件中班挖。

無論是read和write都是把文件視為一個整體鲁捏,也就是說,NodeJs需要在內(nèi)存中開辟與文件相等大小的空間來緩沖內(nèi)容萧芙,如果文件比較小给梅,這的確沒有什么問題,但是如果是一個非常大的(10G)文件會怎樣双揪?內(nèi)存就可能會溢出动羽。

4.1.Stream流介紹

應用程序中,是一組有序的渔期、有起點和終點的字節(jié)數(shù)據(jù)的傳輸方式运吓。在應用程序中各種對象之間交換與傳輸數(shù)據(jù)的時候,總是先將該對象中所包含的數(shù)據(jù)轉(zhuǎn)換為各種形式的流數(shù)據(jù)(即字節(jié)數(shù)據(jù))疯趟,再通過流的傳輸拘哨,到達目的對象后再將流數(shù)據(jù)轉(zhuǎn)換為該對象中可以使用的數(shù)據(jù)。

4.2.Stream流讀取

/*
 *讀取流
  *var stream=fs.createReadStream('文件路徑'); //創(chuàng)建可以讀取的流
   *stream.on(); //然后綁定事件
    *data 事件: 讀取數(shù)據(jù)事件信峻,讀取到數(shù)據(jù)時就觸發(fā)倦青。 默認每次讀取數(shù)據(jù)大小:64Kb
         *end   事件: 數(shù)據(jù)讀取結(jié)束事件盹舞,數(shù)據(jù)讀取結(jié)束時觸發(fā)姨夹。
         *error事件: 錯誤事件,讀取出錯時觸發(fā)矾策。

 */

var fs = require("fs");

var rs=fs.createReadStream("04fileTest111.txt");
// 設置編碼為 utf8磷账。
rs.setEncoding("utf-8");

//存儲每次讀取的數(shù)據(jù),統(tǒng)計讀取的次數(shù)
var dataAll="",count=0;

//綁定data事件贾虽,當讀取到數(shù)據(jù)時執(zhí)行逃糟,每讀取64kb就執(zhí)行一次
rs.on("data",function(data){
    dataAll+=data;
    count++;
    console.log("讀取次數(shù): ",count);
});

rs.on("end",function(){
   //console.log("讀取完畢",dataAll.toString());
    console.log("讀取完畢");
});

rs.on("error",function(err){
    console.error("讀取錯誤",err.message);
});

console.log("程序執(zhí)行完畢");

4.3.Stream流寫入

/*
 * 寫入流:
 *      var stream=fs.createWriteStream('文件路徑'); //創(chuàng)建寫入流
 *      stream.write('要寫入的內(nèi)容,可以多次寫入');
 *      stream.end(); //結(jié)束標記蓬豁,因為以流的方式可以多次寫入绰咽,所以必須要有一個明確結(jié)束標記。
 * 
 *      事件:
 *          finish  完成事件
 *          error   錯誤事件
 */

var fs = require("fs");

//如果文件不存在則會自動創(chuàng)建文件
var ws=fs.createWriteStream("04fileTest22.txt");
for(var i=1;i<=100;i++){
    ws.write(i+"寫入流WriteStream\n");
}
//很重要:以流方式寫入數(shù)據(jù)地粪,因為可以多次寫入取募,所以需要一個明確的結(jié)束標記。
ws.end();

//綁定finish事件蟆技,在寫入完成時觸發(fā)玩敏。告訴用戶寫入成功了斗忌。
ws.on("finish",function(){
    console.log("流寫入完成!M邸织阳!");
});

ws.on("error",function(err){
    throw err;
});

console.log("程序執(zhí)行完畢");

整合案例:

//流式操作

var fs = require('fs');

//創(chuàng)建文件讀取流
var read_stream = fs.createReadStream('04.txt',{encoding:"utf-8"});

//data 事件
read_stream.on('open',function(){
    console.log('open')
})

read_stream.on('ready',function(){
    console.log('ready')

})

read_stream.on('close',function(){
    console.log('close')

})
read_stream.on('end',function(){
    console.log('end')
    write_stream.end();
})
read_stream.on('data',function(ls){
    write_stream.write(ls);
})

//創(chuàng)建文件寫入流
var write_stream = fs.createWriteStream('04-w.txt');

write_stream.on('finish',function(){
    console.log('文件寫入完成');
})

取讀流----》寫入流

image

5.fs管道方式

管道(pipe)提供了一個輸出流到輸入流的機制。通常我們用于從一個流中獲取數(shù)據(jù)并將數(shù)據(jù)傳遞到另外一個流中砰粹。

image

如上面的圖片所示唧躲,我們把文件比作裝水的桶,而水就是文件里的內(nèi)容碱璃,我們用一根管子(pipe)連接兩個桶使得水從一個桶流入另一個桶弄痹,這樣就慢慢的實現(xiàn)了大文件的復制過程。

/*
 * 管道 pipe:
 *       管道(pipe)提供了一個輸出流到輸入流的機制嵌器。通常我們用于從一個流中獲取數(shù)據(jù)并將數(shù)據(jù)傳遞到另外一個流中界酒。
 *  語法:
 *      讀取流.pipe(寫入流);
 */

//需求:使用流實現(xiàn)大文件的復制
var fs = require("fs");
// 創(chuàng)建一個可讀流
var readerStream = fs.createReadStream('input.txt');

// 創(chuàng)建一個可寫流
var writerStream = fs.createWriteStream('output.txt');

// 管道讀寫操作
// 讀取 input.txt 文件內(nèi)容,并將內(nèi)容寫入到 output.txt 文件中
readerStream.pipe(writerStream);

案例:

//流式操作

var fs = require('fs');
var gz = require('zlib');

//創(chuàng)建文件讀取流
var read_stream = fs.createReadStream('04.txt',{encoding:"utf-8"});

//創(chuàng)建文件寫入流
var write_stream = fs.createWriteStream('04.txt.zip');

//創(chuàng)建一個壓縮文件
var file = gz.createGzip();

read_stream.pipe(file).pipe(write_stream);

image
image

6.鏈式流

鏈式是通過連接輸出流到另外一個流并創(chuàng)建多個對個流操作鏈的機制嘴秸。鏈式流一般用于管道操作。

/*
 * 鏈式流:
 *      從輸出流到輸入流庇谆,中間可以由多個中轉(zhuǎn)流組成岳掐,形成一個完整的鏈式體系。
 *  語法:
 *      輸出流.pipe(中轉(zhuǎn)流).pipe(輸入流);
 */

接下來我們就是用管道和鏈式來壓縮和解壓文件饭耳。
創(chuàng)建 compress.js 文件, 代碼如下:

讀取文件--壓縮--寫入文件

//引入文件系統(tǒng)
var fs=require("fs");

//引入壓縮模塊
var zip=require("zlib");

//讀取文件--壓縮--寫入文件
//創(chuàng)建讀取流
var rs=fs.createReadStream("04fileTest2.txt");

//鏈式流壓縮文件
var gzip=zip.createGzip();

//創(chuàng)建寫入流(要保留原來的擴展名.txt)
var ws=fs.createWriteStream("04fileTest2.txt.zip");

//讀取的文件流利用管道壓縮后串述,在通過管道流入寫入文件流
rs.pipe(gzip).pipe(ws);

console.log("文件壓縮成功!");

7.path路徑

NodeJs中寞肖,提供了一個path模塊纲酗,在這個模塊中,提供了許多實用的新蟆、可被用來處理與轉(zhuǎn)換文件路徑的方法及屬性觅赊。

/*
 * path模塊:用來處理與轉(zhuǎn)換文件路徑的方法及屬性。

 path.normalize(p)  規(guī)范化路徑
 path.join([path1][, path2][, ...])  用于連接路徑

 path.dirname(p)  返回路徑中代表文件夾
 path.basename(p[, ext]) 返回路徑中的文件名稱
 path.extname(p) 返回路徑中文件的后綴名

 path.parse()   返回一個對象包含路徑中的每一個部分
 *              .dir    返回路徑中的目錄路徑
 *              .base   返回含擴展名的文件名
 *              .ext    返回擴展名
 *              .name   返回文件名
 */

7.1.API方法和屬性

方法:

方法 & 描述
path.normalize(p)規(guī)范化路徑琼稻,注意'..' 和 '.'吮螺。
path.join([path1][, path2][, ...])用于連接路徑。該方法的主要用途在于帕翻,會正確使用當前系統(tǒng)的路徑分隔符鸠补,Unix系統(tǒng)是"/",Windows系統(tǒng)是""嘀掸。
path.resolve([from ...], to)將 to 參數(shù)解析為絕對路徑紫岩。
path.isAbsolute(path)判斷參數(shù) path 是否是絕對路徑。
path.relative(from, to)用于將路徑轉(zhuǎn)為相對路徑睬塌。
path.dirname(p)返回路徑中代表文件夾的部分泉蝌,同 Unix 的dirname 命令類似歇万。
path.basename(p[, ext])返回路徑中的最后一部分。同 Unix 命令 bashname 類似梨与。
path.extname(p)返回路徑中文件的后綴名堕花,即路徑中最后一個'.'之后的部分。如果一個路徑中并不包含'.'或該路徑只包含一個'.' 且這個'.'為路徑的第一個字符粥鞋,則此命令返回空字符串缘挽。
path.parse(pathString)返回路徑字符串的對象。
path.format(pathObject)從對象中返回路徑字符串呻粹,和 path.parse 相反壕曼。

屬性:

path.sep
平臺的文件路徑分隔符,'' 或 '/'等浊。
path.delimiter平臺的分隔符, ; or ':'.
path.posix提供上述 path 的方法腮郊,不過總是以 posix 兼容的方式交互。
path.win32提供上述 path 的方法筹燕,不過總是以 win32 兼容的方式交互轧飞。

7.2.Path的使用

//路徑的規(guī)范
var testURL=".././test/././demo.mp4";
var commonURL=path.normalize(testURL);
console.log("不規(guī)范: ",testURL,"規(guī)范: ",commonURL);

//連接路徑
var myPath="itsource/h5/";
var joinPath=path.join(myPath,commonURL);
console.log("鏈接后: ",joinPath); //itsource/test/demo.mp4

//目錄名
var dirname=path.dirname(joinPath);
console.log("目錄名",dirname,"目錄名2",path.parse(joinPath).dir);

//文件名
var filename=path.basename(joinPath);
console.log("文件名",filename,"文件名2",path.parse(joinPath).base,"文件名3",path.parse(joinPath).name);

//擴展名
var extname=path.extname(joinPath);
console.log("擴展名",extname,"擴展名2",path.parse(joinPath).ext);

8.url模塊(重點)

url 模塊提供了一些實用函數(shù),用于 URL 處理與解析撒踪。 url模塊提供了兩套API來處理:一個是Node.js遺留的API过咬,另一個則是通常使用在web瀏覽器中 實現(xiàn)了WHATWG URL Standard的API。

1.1.什么是URL制妄?(重點中的重點)

/*
 * URL模塊:
 *      1\. 什么是URL掸绞?
 *          url全球統(tǒng)一資源定位符,對網(wǎng)站資源的一種簡潔表達形式耕捞,也稱為網(wǎng)址衔掸。
 * 
 *      2\. URL的構(gòu)成
 *          //完整結(jié)構(gòu)
 *          協(xié)議://用戶名:密碼@主機名.名.域:端口號/目錄名/文件名.擴展名?參數(shù)名=參數(shù)值&參數(shù)名2=參數(shù)值2#hash
 * 
 *          //http協(xié)議的URL常見結(jié)構(gòu):
 *          協(xié)議://主機名.名.域:端口/目錄名/文件名.擴展名?參數(shù)名=參數(shù)值&參數(shù)名2=參數(shù)值2#hash
 * 
 *          https://www.baidu.com:443/img/bd_logo1.png
 *          http://music.163.com:80/#/discover/playlist
 * 
 *      3\. node.js的URL模塊
 *          在node.js中提供了兩套對于url進行處理的API功能。
 *          1) 老的node.js url模塊
 *          2) 新的url模塊(WHATWG URL標準模塊)
 */
一個 URL 字符串是一個結(jié)構(gòu)化的字符串俺抽,它包含多個有意義的組成部分敞映。 當被解析時,會返回一個 URL 對象磷斧,它包含每個組成部分作為屬性驱显。

image

1.2.API方法和屬性

方法:

方法 & 描述
Class: URL(網(wǎng)址)WHATWG URL標準的實現(xiàn)

屬性:

url.hash獲取及設置URL的分段(hash)部分。
url.host獲取及設置URL的主機(host)部分瞳抓。
url.hostname獲取及設置URL的主機名(hostname)部分埃疫。
url.href獲取及設置序列化的URL。
url.origin獲取只讀序列化的URL origin部分孩哑。
url.pathname獲取及設置URL的路徑(path)部分栓霜。
url.search獲取及設置URL的序列化查詢(query)部分。
...
var url=require("url");
var imgUrl="http://www.uml.org.cn/DevProcess/images/20076614557200.jpg";

//1\. 老的node.js 的url模塊
var oldUrl=url.parse(imgUrl);
console.log("老的URL中的各個部分",oldUrl);

/*
 Url {
 protocol: 'http:',
 slashes: true,
 auth: null,
 host: 'www.uml.org.cn',
 port: null,
 hostname: 'www.uml.org.cn',
 hash: null,
 search: null,
 query: null,
 pathname: '/DevProcess/images/20076614557200.jpg',
 path: '/DevProcess/images/20076614557200.jpg',
 href: 'http://www.uml.org.cn/DevProcess/images/20076614557200.jpg' }
*/

//2\. 新的url模塊(符合WHATWG標準)
var newUrl=new url.Url (imgUrl);
console.log("新的URL中的各個部分",newUrl);

/*
 URL {
 href: 'http://www.uml.org.cn/DevProcess/images/20076614557200.jpg',
 origin: 'http://www.uml.org.cn',
 protocol: 'http:',
 username: '',
 password: '',
 host: 'www.uml.org.cn',
 hostname: 'www.uml.org.cn',
 port: '',
 pathname: '/DevProcess/images/20076614557200.jpg',
 search: '',
 searchParams: URLSearchParams {},
 hash: '' }
*/

mode.js仿Apach服務創(chuàng)建

const http = require('http');
const fs = require('fs');
const url = require('url');

//創(chuàng)建服務
let server = http.createServer(function(request,response){
    //根據(jù)自己服務器文件的創(chuàng)建目錄的規(guī)則横蜒,創(chuàng)建查找文件的格式
    //fs.Stats 對象提供有關(guān)文件的信息胳蛮。
    fs.stat('work' + request.url,function(error,stat){  //['work']----->文件的名稱    [request.url]------->請求文件下的文件路徑   [function(error,stat){}]-----》回調(diào)函數(shù)销凑,用于判斷請求的文件是否找到。
        if(error){
            //response.writeHead向請求發(fā)送響應頭仅炊。
            response.writeHead(404 ,'not found' ,{"Content-Type":"text/plain;charset=utf-8"} )   //"Content-Type":"text/plain;charset=utf-8"  請求的類型  //[text/plain]普通文本
            response.write('文件未找到');
            response.end()   //打斷
        }else{
            //當瀏覽器可以找到文件是判斷文件是否是空文件斗幼,或者包含子目錄
            if(stat.isFile()){
                //異步地讀取文件的全部內(nèi)容。
                fs.resdFile('work' + request.url,function(error,data){
                    if(error){
                        response.writeHead(500, 'server  error' , {"Content-type":"text/plain;charset=utf-8"})    //[500, 'server  error' ,]------->但瀏覽器可以打開文件時判斷是否可以找到文件下的某一文件
                        response.write('服務器錯誤');
                        response.end()  //打斷
                    }else{
                        response.writeHead(200, 'ok',{"Content-type":"text/html;charset=utf-8"})
                        response.write(data);
                        response.end()  //打斷
                        }
                    });
            }else{
                //當在文件目錄中沒有找到文件時
                var file = path.join('work' +request.url,function(error,data){
                    if(error){
                        //response.writeHead向請求發(fā)送響應頭抚垄。
                        response.writeHead(404 ,'not found' ,{"Content-Type":"text/plain;charset=utf-8"} )   //"Content-Type":"text/plain;charset=utf-8"  請求的類型  //[text/plain]普通文本
                        response.write('文件未找到');
                        response.end()   //打斷
                    }else{
                        response.writeHead(200, 'ok',{"Content-type":"text/html;charset=utf-8"})
                        response.write(data);
                        response.end()  //打斷
                        }
                    });                    
                }
            }
        });
    });
console.log(11111111111111111111);
//開啟監(jiān)聽端口
server.listen('13000',function(){
    console.log('服務器已開啟')
});

9.課程總結(jié)

9.1.重點

1.緩存區(qū)讀寫
2.文件系統(tǒng)基本操作
3.文件流讀寫

9.2.難點

1.流讀寫

9.3.如何掌握蜕窿?

1.此技能通過使用升級。
2.將常見的用法截圖保存到文件夾中呆馁,時惩┚回顧。

9.4.排錯技巧(技巧)

1.console.log()方法浙滤。

10.作業(yè)

作業(yè)難度: ☆☆☆
1阴挣、Buffer有什么作用?
2纺腊、文件讀取方式的有幾種畔咧,方法名是那些?
3、說說你對管道流的理解。
4、path模塊的作用? 有哪些常用的方法蠢沿?
5、url模塊的作用扣典? 有哪些常用的方法懂傀?
6、使用管道操作實現(xiàn)對一個文件體積較大的文件的復制
7犀呼、使用鏈式流實現(xiàn)對文件的壓縮
8幸撕、使用代碼刪除某個文件夾,該文件夾不為空外臂。(遞歸實現(xiàn))

11.面試題

1.說說你對管道流的理解坐儿?

12.擴展知識或課外閱讀推薦(可選)

12.1.擴展知識

在計算機中最小的【運算】單位是: 二進制位 bit
在計算機中最小的【存儲】單位是: 字節(jié) byte

1個字節(jié) = 8個二進制位 >> 1byte = 8bit
1個字節(jié):
0000 0000

需求: 向計算機中存儲一個數(shù)字 5 ,怎么存宋光?
1)需要將 5 轉(zhuǎn)換成為二進制
2)進行存儲

進制:
十進制: 逢十進一貌矿,如何表示: 0 1 2 3 4 5 6 7 8 9 10
二進制: 逢二進一,如何表示: 0 1 10 11 100 101
八進制: 逢八進一罪佳,如何表示: 0 1 2 3 4 5 6 7 10
十六進制:逢十六進一逛漫,如何表示: 0 1 2 3 4 5 6 7 8 9 a b c d e f 10

ff0000 == rgb(255,0,0)

進制轉(zhuǎn)換:

1)十進制轉(zhuǎn)其它進制(二進制、八進制赘艳、十六進制)

除法取余酌毡,倒回來讀

示例: 十進制 22 => 二進制 10110
22 % 2 余數(shù) 0
11 % 2 余數(shù) 1
5 % 2 余數(shù) 1
2 % 2 余數(shù) 0
1 % 2 余數(shù) 1
0

2)其它進制轉(zhuǎn)十進制

乘法

示例: 二進制 10110 > 十進制 22
12^4 + 02^3 + 12^2 + 12^1 + 0*2^0 = 16 + 0 + 4 + 2 + 0 = 22

十六進制ff > 十進制 255
f16^1 + f16^0 = 1516 + 151 = 240+15 = 255

編碼:

    ascii   美國通用信息編碼集克握, 0--127   => 二進制 0-- 0111 1111  , 占1個字節(jié)
    utf-8   全球通用信息編碼集枷踏,一個中文占三個字節(jié)
        0011 0001
        0000 0000 0000 0000 0011 0001
        8123000 張
        8123001 李
        8123002 王   => 0111 1011 1111 0010 0111 1010

gbk     中國國家通用信息編碼集菩暗,一個中文占兩個字節(jié)
        0000 0000 0000 0000
        256  張
        257 李   => 0000 0001 0000 0001
        258 王   => 0000 0001 0000 0010

big5    繁體中文
    unicode 全球通用信息編碼集,大字符集
        0000 0000 0000 0000 0000 0000 0011 0001

注意:計算機在存儲時旭蠕,存儲的是字符在編碼集中的編號(編號是一個數(shù)字停团,數(shù)字可以轉(zhuǎn)換成為二進制)

//如果目錄有多級目錄和文件,需定義遞歸函數(shù)下梢,并且使用同步操作來刪除
function delDir(dirName){
    var  fileList=fs.readdirSync(dirName);//獲取文件或者目錄列表
    for(var i=0;i<fileList.length;i++){
        var subContent=dirName+"/"+fileList[i]; //子目錄或者文件
        var stats=fs.statSync(subContent); //獲取文件信息
        if(stats.isFile()){
            //遞歸出口:文件直接刪除
            fs.unlinkSync(subContent);
            console.log(subContent+"--文件刪除成功客蹋!");
        }
        else if(stats.isDirectory()){
            //遞歸入口: 是目錄就需要調(diào)用自己逐級刪除
            delDir(subContent);
        }
    }
    //全部刪除完當前目錄的文件和子目錄后,最后再來刪除父目錄
    fs.rmdirSync(dirName);
    console.log(dirName,"目錄刪除成功孽江!");
}
//調(diào)用遞歸
delDir(rootDir);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讶坯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子岗屏,更是在濱河造成了極大的恐慌辆琅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件这刷,死亡現(xiàn)場離奇詭異婉烟,居然都是意外死亡,警方通過查閱死者的電腦和手機暇屋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門似袁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咐刨,你說我怎么就攤上這事昙衅。” “怎么了定鸟?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵而涉,是天一觀的道長。 經(jīng)常有香客問我联予,道長啼县,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任沸久,我火速辦了婚禮季眷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卷胯。我一直安慰自己瘟裸,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布诵竭。 她就那樣靜靜地躺著话告,像睡著了一般兼搏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沙郭,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天佛呻,我揣著相機與錄音,去河邊找鬼病线。 笑死吓著,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的送挑。 我是一名探鬼主播绑莺,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惕耕!你這毒婦竟也來了纺裁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤司澎,失蹤者是張志新(化名)和其女友劉穎欺缘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挤安,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡谚殊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛤铜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫩絮。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖围肥,靈堂內(nèi)的尸體忽然破棺而出剿干,到底是詐尸還是另有隱情,我是刑警寧澤虐先,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布怨愤,位于F島的核電站派敷,受9級特大地震影響蛹批,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜篮愉,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一腐芍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧试躏,春花似錦猪勇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽助析。三九已至,卻和暖如春椅您,著一層夾襖步出監(jiān)牢的瞬間外冀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工掀泳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雪隧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓员舵,卻偏偏與公主長得像脑沿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子马僻,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容