1. 程式人生 > >node.js學習(2)

node.js學習(2)

node.js 模組學習

學習一門新語言,就要學習它的api。(ps:這筆記其實早寫好了,前幾天做個h5,沒時間排版,等h5結束了,再總結。)

1:nodejs 檔案操作

node.js不只是能做網路程式設計,還能操作檔案
基本api

(1)小檔案拷貝

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))

以上程式碼使用fs.readFileSync 從原路徑讀取檔案內容,使用fs.writeFileSync將檔案寫入目標

(2)大檔案拷貝

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))

使用了fs.createReadStream建立一個原始檔的只讀資料流,使用fs.createWriteStream建立一個只寫資料流,用pipe方法把資料流連線

3:buffer緩衝 資料塊

js語言只有字串資料型別,沒有二進位制資料型別,所以node.js提供了一個與string對於的函式buffer來操作二進位制資料
(1)var bin = new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
可以用index和length 屬性
(2) 可以與字串相互轉化
var str = bin.toString(‘utf-8’);
var bin = new Buffer(‘hello’,’utf-8’)
(3) 與字串不同,他的改變是指標型別,而字串是得到一個新字元
因此如果拷貝Buffer,需要新建立一個Buffer,在用copy把Buffer資料複製過去

4:stream 資料流,資料的流向

因為記憶體無法一次性裝下太多資料或者一邊讀取一邊處理更加高效,所以用到stream資料了。
大檔案拷貝,可以用只讀資料流
var rs = fs.createReadStream(pathname);
rs.on(‘data’,function(chunk){
doSomething(chunk);
})
rs.on(‘end;,function(){
cleanUp();
})
加入回撥
var rs = fs.createReadStream(pathname);
rs.on(‘data’,function(chunk){
rs.pause();
doSomething(chunk,function(){
rs.resume();
});
})
rs.on(‘end;,function(){
cleanUp();
})

var rs = fs.createReadStream(src);
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();
})

5:node.js 通過內建fs模組對檔案操作

(1)檔案屬性讀寫

fs.stat,fs.chmod,fs.chown

(2)檔案內容讀寫

fs.readFile,fs.readdir,fs.writeFile,fs.mkdir

(3)底層檔案操作

fs.open,fs.read,fs.write,fs.close;

node.js優點在fs模組體現,非同步IO模型;

fs.readFile(pathname,function(err,data){
if(err){
Deal with error
}else{
Deal with data
}
})
如果模組無法非同步操作,可以用sync
try {
var data = fs.readFileSync(pathname);
// Deal with data.
} catch (err) {
// Deal with error.
}

6:path

node.js內建path模組簡化操作。
var cache = {};

function store(key, value) {
cache[path.normalize(key)] = value;
}

store(‘foo/bar’, 1);
store(‘foo//baz//../bar’, 2);
console.log(cache); // => { “foo/bar”: 2 }

path.join,path.extname

7:遍歷目錄

遍歷目錄是操作檔案時的一個常見需求。比如寫一個程式,需要找到並處理指定目錄下的所有JS檔案時,就需要遍歷整個目錄。

(1)遞迴演算法

function factorial(n){
if(n === 1){
return 1;
}else{
return n*factorial(n-1)
}
}

(2)遍歷演算法

目錄是個樹狀結構,遍歷使用深度優先+先序遍歷演算法
function travel(dir,callback){ //dir?,callback?
fs.readFileSync(dir).forEach(function(file){
var pathname = path.join(dir,file);
if(fs.statSync(pathname).isDirectory()){
travel(pathname,callback)
}else{
callback(pathname)
}
})
}
非同步遍歷
function travel(dir, callback, finish) {
fs.readdir(dir, function (err, files) {
(function next(i) {
if (i < files.length) {
var pathname = path.join(dir, files[i]);

            fs.stat(pathname, function (err, stats) {
                if (stats.isDirectory()) {
                    travel(pathname, callback, function () {
                        next(i + 1);
                    });
                } else {
                    callback(pathname, function () {
                        next(i + 1);
                    });
                }
            });
        } else {
            finish && finish();
        }
    }(0));
});

}

8:檔案編碼

使用node.js,操作最多的就是文字檔案。這就涉及到檔案編碼問題,常用的文字有utf8(可能帶有dom)和gbk,
DOM用於編輯一個檔案檔案使用unicode編碼,本身是一個unicode字元,位於檔案頭部