node學(xué)習(xí)筆記(二)流和緩沖區(qū)

內(nèi)容

視頻
第四章內(nèi)容
菜鳥(niǎo)教程服務(wù)器

//復(fù)制文件
function de(x) {
    console.log(x);
}
var fs=require('fs');
fs.mkdir('stuff',function () {
   fs.readFile('readme.txt',function (err,data) {
       de(data);
       fs.writeFile('./stuff/writeme.txt',data,function () {
           de('copy sucessfully');
       });
   }) ;
});
//del
function de(x) {
    console.log(x);
}
var fs=require('fs');
fs.unlink('./stuff/readme.txt',function () {
    de('del sucessfully');
})
//返回一個(gè)html頁(yè)面
res.writeHead(200,{'Content-Type':'text/html'});
var myReadStream=fs.createReadStream('sample.html','utf8');
myReadStream.pipe(res);
//創(chuàng)建路由的方法
console.log(req.url);
        if(req.url==='/'||req.url==='/home')
        {
            res.writeHead(200,{'Content-Type':'text/html'});
            var myReadStream=fs.createReadStream('sample.html','utf8');
            myReadStream.pipe(res);
        }
        else if(req.url==='/devilman')
        {
            res.writeHead(200,{'Content-Type':'application/json'});
            var jsonobj={
                name:'devilman',
                atk:2000,
                def:1500
            };
            res.end(JSON.stringify(jsonobj));
        }
        else {
            res.writeHead(404,{'Content-Type':'text/html'});
            var myReadStream=fs.createReadStream('404.html','utf8');
            myReadStream.pipe(res);
        }

HTTP狀態(tài)碼

200 一切正常
301 請(qǐng)求的URL已經(jīng)被移走
400 請(qǐng)求的格式是無(wú)效的
401 客戶(hù)端沒(méi)有權(quán)限
403 服務(wù)器拒絕這個(gè)請(qǐng)求
404 Not Found
500 狀態(tài)不一致,出現(xiàn)bug
503 運(yùn)行時(shí)的錯(cuò)誤

//substr方法左閉右開(kāi)

EventEmitter

//once(event, listener)
為指定事件注冊(cè)一個(gè)單次監(jiān)聽(tīng)器,即 監(jiān)聽(tīng)器最多只會(huì)觸發(fā)一次,觸發(fā)后立刻解除該監(jiān)聽(tīng)器。
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
//removeListener(event, listener)
移除指定事件的某個(gè)監(jiān)聽(tīng)器,監(jiān)聽(tīng)器必須是該事件已經(jīng)注冊(cè)過(guò)的監(jiān)聽(tīng)器。
它接受兩個(gè)參數(shù),第一個(gè)是事件名稱(chēng),第二個(gè)是回調(diào)函數(shù)名稱(chēng)。

var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
//removeAllListeners([event])
移除所有事件的所有監(jiān)聽(tīng)器, 如果指定事件,則移除指定事件的所有監(jiān)聽(tīng)器。
//setMaxListeners(n)
默認(rèn)情況下, EventEmitters 如果你添加的監(jiān)聽(tīng)器超過(guò) 10 個(gè)就會(huì)輸出警告信息。 setMaxListeners 函數(shù)用于提高監(jiān)聽(tīng)器的默認(rèn)限制的數(shù)量。
//listeners(event)
返回指定事件的監(jiān)聽(tīng)器數(shù)組。
//emit(event, [arg1], [arg2], [...])
按參數(shù)的順序執(zhí)行每個(gè)監(jiān)聽(tīng)器,如果事件有注冊(cè)監(jiān)聽(tīng)返回 true,否則返回 false。

Buffer

JS只有String類(lèi)型,沒(méi)有二進(jìn)制數(shù)據(jù)類(lèi)型,特此有一個(gè)Buffer類(lèi)來(lái)存放二進(jìn)制數(shù)據(jù)

const buf=Buffer.from('runoob','ascii');
console.log(buf.toString('utf8'));
// 創(chuàng)建一個(gè)長(zhǎng)度為 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);

// 創(chuàng)建一個(gè)長(zhǎng)度為 10、且用 0x1 填充的 Buffer。 
const buf2 = Buffer.alloc(10, 1);

// 創(chuàng)建一個(gè)長(zhǎng)度為 10、且未初始化的 Buffer。
// 這個(gè)方法比調(diào)用 Buffer.alloc() 更快,
// 但返回的 Buffer 實(shí)例可能包含舊數(shù)據(jù),
// 因此需要使用 fill() 或 write() 重寫(xiě)。
const buf3 = Buffer.allocUnsafe(10);

// 創(chuàng)建一個(gè)包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);

// 創(chuàng)建一個(gè)包含 UTF-8 字節(jié) [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');

// 創(chuàng)建一個(gè)包含 Latin-1 字節(jié) [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');
buf=Buffer.alloc(256);
len=buf.write('fym is tianxiadiyi');
console.log('寫(xiě)入的字節(jié)數(shù)'+len);
buf=Buffer.alloc(26);
for(var i=0;i<26;i++)
{
    buf[i]=i+97;
}
de(buf.toString('ascii'));
de(buf.toString('ascii',0,5));//abcde
//轉(zhuǎn)成JSON文件
const buf=Buffer.from([0x1,0x2,0x3,0x4,0x5]);
const json=JSON.stringify(buf);
de(json);//{"type":"Buffer","data":[1,2,3,4,5]}
//Buffer合并
var buffer1 = Buffer.from(('菜鳥(niǎo)教程'));
var buffer2 = Buffer.from(('www.runoob.com'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 內(nèi)容: " + buffer3.toString());
//Buffer比較
//有一個(gè)length函數(shù)記錄長(zhǎng)度
var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('RUNOOB');
//將 buf2 插入到 buf1 指定位置上
buf2.copy(buf1, 2);
console.log(buf1.toString());//abRUNOOBijkl
//Buffer裁剪
var buffer1 = Buffer.from('runoob');
// 剪切緩沖區(qū)
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString());

Stream

//讀入流
var fs=require('fs');
var data='';
var rst=fs.createReadStream('gou.txt');
rst.setEncoding('utf8');
rst.on('data',function (chunk) {
    data+=chunk;
});
rst.on('end',function () {
   de(data);
});
rst.on('error',function (err) {
    de(err.stack);
});
de('fuck');
//寫(xiě)流
var fs = require("fs");
var data = '菜鳥(niǎo)教程官網(wǎng)地址:www.runoob.com';
// 創(chuàng)建一個(gè)可以寫(xiě)入的流,寫(xiě)入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');
// 使用 utf8 編碼寫(xiě)入數(shù)據(jù)
writerStream.write(data,'UTF8');
// 標(biāo)記文件末尾
writerStream.end();
// 處理流事件 --> data, end, and error
writerStream.on('end', function() {
    console.log("寫(xiě)入完成。");
});

writerStream.on('error', function(err){
    console.log(err.stack);
});

console.log("程序執(zhí)行完畢");
//管道流 從文件傳到另一個(gè)文件
var fs = require("fs");
// 創(chuàng)建一個(gè)可讀流
var readerStream = fs.createReadStream('input.txt');
// 創(chuàng)建一個(gè)可寫(xiě)流
var writerStream = fs.createWriteStream('output.txt');
// 管道讀寫(xiě)操作
// 讀取 input.txt 文件內(nèi)容,并將內(nèi)容寫(xiě)入到 output.txt 文件中
readerStream.pipe(writerStream);

console.log("程序執(zhí)行完畢")
//壓縮
var fs = require("fs");
var zlib = require('zlib');

// 壓縮 input.txt 文件為 input.txt.gz
fs.createReadStream('gou.txt')
    .pipe(zlib.createGzip())
    .pipe(fs.createWriteStream('gou.txt.gz'));

console.log("文件壓縮完成。");
//解壓
var fs = require("fs");
var zlib = require('zlib');

// 解壓 input.txt.gz 文件為 input.txt
fs.createReadStream('input.txt.gz')
  .pipe(zlib.createGunzip())
  .pipe(fs.createWriteStream('input.txt'));
  
console.log("文件解壓完成。");

模塊

有關(guān)循環(huán)調(diào)用

node自帶防止循環(huán)調(diào)用的機(jī)制,實(shí)在是強(qiáng),先初始化,最后再生效

if(typeof d=='string');//判斷弱變量的變量類(lèi)型
要將buf轉(zhuǎn)換成字符串,需要用到toString的方法
buff.fill("\0")清零的方法


根據(jù)擴(kuò)展名返回不同類(lèi)型文件

function content_distribution(file) {
    var ext=path.extname(file);
    switch (extname.toLowerCase()) {
        case '.html':return "text/html";
        case '.css': return "text/css";
        case '.jpg'return "image/jpeg";
        default return "text/plain";
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容