NodeJs基礎(文件系統)

文件系統

在Node中,與文件系統的交互是非常重要的,服務器的本質就是將本地的文件發送到遠程的客戶端

Buffer(緩沖區)

Node中提供的新的對象,這個對象可以在node中直接使用,不需要引入;和js中的數組(js數組缺點:無法存儲二進制數據)非常相似;Buffer中只能保存二進制數據

  • 在Buffer中每一個元素都是二進制數據,但是直接打印時,會以十六進制顯示;Buffer中每一個范圍在00 ff之間(0 255),對應的二進制是00000000 11111111
    • buf.length 獲取的是內容占用內存的大小,而不是長度;每個漢字在內存中占用3個字節
  • 將一個字符串轉換為一個Buffer
    • var buf = Buffer.from('Hello');
  • Buffer轉換為字符串
    • var str = buf.toString();
  • 創建一個Buffer對象
    • var buf = Buffer.alloc(size);
      • 分配內存并初始化
      • size 是Buffer的大小,size的單位是kb,可直接計算;(alloc:分配)
  • 向buf中添加元素
    • 通過索引對buffer中的元素進行操作
    • 只要數字輸出如console.log(10)/alert(10)就是會以十進制輸出
    • Number的toString(2/8/16)可以指定數字的進制
    • Buffer的大小一旦確認則不能修改;因為Buffer是直接對內存進行操作;為了性能更好所以大小都是不能改變
    • 數字的值不要超過255,超過會溢出
  • 遍歷
    for(var i=0; i < Buffer.length; i++){ 
        console.log(buf[i]) 
    }  
  • Buffer.allocUnsafe(size)
    • 創建一個指定大小的Buffer,不初始化。該Buffer中可能含有敏感數據
    • 比Buffer.alloc(size) 性能高,但是不安全

fs 文件系統

Node通過fs模塊和文件系統進行交互,使用文件系統必須先引入fs模塊;fs模塊屬于node的核心模塊,不需下載,直接引入即可

  • fs模塊操作都有同步和異步調用
    • 同步會阻塞系統;異步不會阻塞系統
    • 異步肯定會有回調函數
  • fs模塊中所有方法都有兩份版本
    • 不帶sync,異步版本
    • 帶sync,同步版本
  • 文件寫入
    1. 打開文件 如果沒有文件會自動新建文件
fs.open(path,flags[,mode],callback);  
fs.openSync(path,flags[,mode]);  

參數:
path 打開文件的路徑
flags 對文件操作的類型,需要一個字符串作為參數 'r'/'w'
mode 設置文件的權限(主要針對Linux),一般不傳
callback 回調函數,所有的異步方法必有回調函數
同步操作依靠返回值:當打開文件以后,會返回一個文件描述符作為返回值;文件描述符: 在形式上是一個非負整數。實際上,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。

  1. 寫入內容并保存
    fs.write(fd,string[,position[,encoding]],callback);    
    fs.writeSync(fd,string[,position[,encoding]]);    

參數:
fd:要寫入的文件的描述符
string:要寫入的內容
position:寫入的起始的位置
encoding:寫入文件的編碼 默認utf-8

  1. 關閉文件
    fs.close(fd,callback);    
    fs.closeSync(fd); 

參數:
fd:要關閉的文件的文件描述符

異步文件寫入

callback 回調函數,所有的異步方法必有回調函數
異步方法都是通過回調函數(的參數形式)返回結果
回調函數有兩個參數:

  • err 錯誤信息,如果該對象存在,則證明出錯了(錯誤優先原則)
  • fd 文件操作符,代表此時打開的文件
    打開文件代碼:
      fs.open('fileName','w',function(err,fd){
        //如果沒有錯誤
        if(!err){
            //寫入文件
            fs.write(fd,'string',function(err){
                if(!err){
                //輸出一句話
                console.log('寫入成功')
                }

            //關閉文件
            fs.close(fd,function(err){
                if(!err){
                //輸出一句話
                console.log('關閉成功') 
                }
            });
        });
        }
      }); 

簡單文件寫入

    fs.writeFile(filePath,data[,options],callback)  
    fs.writeFileSync(filePath,data[,options])

參數:
filePath:要寫入的文件的路徑
data:要寫入的數據(String或Buffer)
options:配置選項,需要一個對象作為參數,一般不需要

  • encoding 文件的編碼 默認--utf8
  • mode 文件的權限(一般不寫) 默認--0666
  • flag 操作的類型 默認 'w'
    callback 寫入完成以后調用的函數
    fs.writeFile('filePath','內容',function(err){  
        if(!err){  
            console.log('寫入成功')  
        }else if(err){  
            console.log(err)  
        }  
    })  

文件的操作符

  • w 對文件進行寫操作 文件不存在則報錯
  • r 對文件進行讀操作 文件不存在則新建
  • a 對文件進行追加操作 文件不存在則新建

流式文件寫入

  • 傳統的寫入方式都是一次性將內容寫入到文件中,如果文件過大,先將內容全部加載進內存后寫入,這樣在寫入較大的數據時,容易導致內存溢出或者性能較差
  • 所以我們需要引入流式文件寫入來處理較大的文件
  • 流主要使用兩種
    • 可寫流
    • 可讀流
    //創建可寫流  
    var ws = fs.createWriteStream('filePath');  
    
    //監視流的狀態,可以通過為流綁定open和close事件來監視流的狀態(多次)   
    ws.on('open',function(){  
        console.log('流打開了')  
    });  
    
    ws.on('close',function(){  
        console.log('流關閉了')  
    }) 
    //once()可以為一個對象綁定一個一次性的事件,該事件將會在觸發一次后自動失效(一次) 
    ws.once('open',function(){  
        console.log('流打開了')  
    });  
    
    ws.once('close',function(){  
        console.log('流關閉了')  
    }) 
    //通過可寫流向文件寫入內容
    ws.write('datas')
    
    //關閉流
    ws.close(); 此方法會導致數據缺失 
    ws.end(); 可以將數據寫入到文件,并關閉流

文件讀取

1. 同步文件讀取

2. 異步文件讀取

3. 簡單文件讀取

    fs.readFile(path[,options],callBack);  
    fs.readFileSync(path[,options]);  
  • 參數:
    • path:讀取文件的路徑
    • options:配置對象
      • encoding:指定打開文件的編碼,默認是null
      • flag:文件的操作類型,默認是 r
    • callBack:回調函數,通過回調函數返回讀取到的數據
      • err:錯誤對象
      • data:返回的數據(Buffer)
    fs.readFile('fileName',function(err,date){  
        if(!err){
            console.log(data);  
    
            //將讀取到的數據寫入到磁盤的其他位置
            fs.writeFile('path',data,function(err){
                if(!err){   
                    console.log('寫入成功')
                }  
            })  
        }  
    })  

4. 流式文件讀取

  • 流式文件讀取,適合較大的文件
    //創建一個可讀流  
    var rs = fs.creatReadStream('fileName');     
    var ws = fs.creatWritStream('fileName');  
    rs.pipe(ws);  

    //監聽rs的打開和關閉事件  
    rs.once('open',function(){    
        console.log('');    
    });      
    rs.once('close',function(){    
        console.log('');    
    });   

    //通過可讀流讀取一個文件,必須為流綁定data事件,當綁定data事件以后,流會自動讀取     
    rs.on('data',function(data){    
        console.log(data);    
    });    

其他操作

  • 驗證路徑是否存在
    fs.existsSync('path');
    • 返回值:文件存在為true;文件不存在為false
    • 同步和異步方法各有特點,具體情況區分使用
  • 用來獲取一個文件的狀態
     fs.stat(path,callBack);  
     fs.statSync(path);    

參數:

  • path:要獲取狀態文件的路徑
  • callBack:
    • err:錯誤對象
    • stats:狀態對象,用來描述文件的狀態
  • 刪除一個文件
    fs.unlink('path',callBack);      
    fs.unlinkSync('path');    
  • 讀取當前目錄下的所有文件和文件夾的列表
    fs.readdir('path'[,options],callBack);  
    fs.readdirSync('path'[,options]);    
  • 截斷文件,使文件變成指定大小
    fs.truncate('path',length,callBack);  
    fs.truncateSync('path',length);    
  • 創建文件夾
    fs.mkdir('path'[, options],callBack);  
    fs.mkdirSync('path'[, options]);  
  • 刪除文件夾
    fs.rmdir('path',callBack);  
    fs.rmdirSync('path');    
  • 重寫文件和目錄名:可以實現剪切功能
    fs.rename('oldPath','newPath',callBack);    
    fs.renameSync('oldPath','newPath');  
  • 監聽文件 每隔一段時間去判斷文件是否發生改變
    fs.watchFile(filename[,option],listener);
    • listener:回調函數,傳遞兩個參數,是stats類型的對象
      • current:表示當前文件的狀態
      • previous:表示修改之前文件的狀態
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 文件系統模塊是一個封裝了標準的 POSIX 文件 I/O 操作的集合。通過require('fs')使用這個模塊。...
    保川閱讀 799評論 0 0
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,366評論 0 6
  • //公共引用 varfs =require('fs'), path =require('path'); 1、讀取文...
    才気莮孒閱讀 838評論 0 1
  • Node.js 常用工具 util 是一個Node.js 核心模塊,提供常用函數的集合,用于彌補核心JavaScr...
    FTOLsXD閱讀 544評論 0 2
  • 當我們覺醒過來,或是以其他各種正面的方式來回應人生的困境挑戰時,我們就開創出了一條「能量通道」,這條通道讓其他人可...
    與姝會友閱讀 325評論 0 0