學習筆記:node.js(一)

模塊——require/exports/module

var fs = require('fs');
var http = require('http');  //引用模塊

module.exports = function(){} // 輸出模塊

文件拷貝

小文件拷貝

var fs = require('fs');

function copy(src, dst) {
    fs.writeFileSync(dst, fs.readFileSync(src));
}

function main(argv) {
    copy(argv[0], argv[1]);
}

main(process.argv.slice(2));

process是一個全局變量,可經過process.argv得到命令行參數。因爲argv[0]固定等於nodejs執行程序的絕對路徑,argv[1]固定等於主模塊的絕對路徑,所以第一個命令行參數從argv[2]這個位置開始。node

大文件拷貝

var fs = require('fs');

function copy(src, dst) {
    fs.createReadStream(src).pipe(fs.createWriteStream(dst));
}

function main(argv) {
    copy(argv[0], argv[1]);
}

main(process.argv.slice[2]);

Buffer(數據塊)

Buffer提供了對二進制數據的操做。
構造Buffer實例:api

var bin = new Buffer([0x68, 0x6c, 0x6c, 0x6f]);

Buffer與字符串互相轉化:數組

var str = bin.toString('utf-8'); // => "hello"
將字符串轉換爲指定編碼下的二進制數據:
var bin = new Buffer('hello', 'utf-8'); // => <Buffer 68 65 6c 6c 6f>

Buffer與字符串的區別:
字符串是隻讀的,而且對字符串的任何修改獲得的都是一個新的字符串,原字符串保持不變,至於Buffer,更像是能夠作指針操做的c語言數組,改變的是指針的指向,若是修改的話,原Buffer也會被改動。緩存

var bin = new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
var sub = bin.slice(2);

sub[0] = 0x65;
console.log(bin); // => <Buffer 68 65 6c 6f>

若是想拷貝一份Buffer,得首先建立一個新的Buffer,並經過.copy方法把原Buffer中的數據複製過去。異步

var bin = new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
var dup = new Buffer(bin.length);

bin.copy(dup);
dup[0] = 0x48;
console.log(bin); // => <Buffer 68 65 6c 6c 6f>
console.log(dup); // => <Buffer 48 65 6c 6c 6f>

Stream(數據流)

若是內存沒法一次裝下須要處理的數據時,就須要用到數據流,一邊讀取一邊處理。ui

var rs = fs.createReadStream(pathname);

rs.on('data', function(chunk) {
    rs.pause(); //在處理數據前暫停數據讀取,並在處理數據後繼續讀取數據
    dosomething(chunk);
});

rs.on('end', function() {
    cleanUp();
});

爲數據目標建立一個只寫數據流,示例以下:編碼

var rs = fs.createReadStream(pathname);
var ws = fs.createWriteStream(dst);

rs.on('data', function(chunk) {
    if(ws.write(chunk) === false) { //寫入速度跟不上讀取速度時,只寫數據流內部的緩存會爆倉,根據返回值判斷傳入的數據時寫入目標了仍是臨時放在緩存了
        rs.pause(); //若是是放入緩存,就暫停數據數據讀取
    }
});

rs.on('end', function() {
    ws.end();
});

ws.on('drain', function() {
    rs.resume();
});

File System(文件系統)

fs模塊提供的api基本上能夠分爲三類:命令行

  • 文件屬性讀寫
    fs.stat、fs.chmod、fs.chown等指針

  • 文件內容讀寫
    fs.readFile、fs.readdir、fs.writeFile、fs.mkdir等code

  • 底層文件操做
    fs.open、fs.read、fs.write、fs.close等
    基本全部的fs模塊api的回調參數都是兩個
    fs.readFile(pathname, function(err, data) {

    if(err) {
        //deal with error.
    }else {
        //deal with data.
    }

    }); //異步IO模型

    try {

    var data = fs.readFileSync(pathname);
    //deal with data.

    } catch (err) {

    //deal with error.

    }; //同步模型

Path(路徑)

  • path.normalize(key) //將傳入的路徑轉換成標準路徑

  • path.join() //將傳入的多個路徑拼接爲標準路徑

  • path.extname //取得文件的擴展名

    path.extname('foo/bar.js');  // => ".js"
相關文章
相關標籤/搜索