異步讀取文件
按照js的標準,異步讀取一個文本文件的格式如下:
'use strict'
const fs = require('fs')
fs.readFile('test.txt', 'utf-8', function(err, data){
if(err){
cconsole.log(err)
}else{
console.log(data)
}
})
請注意,test.txt文件必須在當前目錄下,且文件編碼必須為utf-8
如果我們讀取的文件不是文本文件,而是二進制文件,怎么辦呢?
下面演示如何讀取一個圖片文件:
'use strict'
const fs = rquire('fs')
fs.readFile('test.png', function(err, data){
if(err){
console.log(err)
}else{
console.log(data)
console.log(data.length + 'bayes')
}
})
當讀取二進制文件時,不傳入文件編碼時,回調函數的data參數將返回一個buffer
對象。在Node.js中,buffer
對象可以和String
做轉換,例如,把一個buffer
轉化成String
:
var text = data.toString('utf-8')
把String
轉化為Buffer
var buf = new Buffer('text', 'uft-8')
同步讀取文件
fs
模塊也提供相應的同步讀取文件函數。與異步相比,多了一個Sync后綴,并且不接受回調函數,函數直接返回結果。
用fs
模塊同步讀取文件如下:
'use strict'
const fs = require('fs')
var data = fs.readFileSync('test'.txt, 'utf-8')
如果同步讀取文件失敗,則需要使用try...catch
捕獲該錯誤。
try{
var data = fs.readFileSync('test.txt', 'utf-8')
}catch(err){
// 出錯了
}
寫文件
例如:
'use strict'
const fs = require(''fs)
fs.writeFile('test.txt', data, function(err){
if(err){
console.log(err)
}else{
console.log('ok')
}
})
writeFile
方法的參數依次是文件名,數據和回調函數。如果傳入的數據類型是String
,默認按UTF-8
編碼寫入文件,如果傳入的數據類型是Buffer
,則寫入的是二進制文件。回調函數只關心成功與否,因為需要一個err
參數。
和 readFile
類似,writeFile
也有一個同步的方法,叫writeFileSync
,例如:
const data = 'Hello,Node.js'
writeFileSync('test.txt', data)
stat
如果我們要獲取文件的大小,創建時間等信息,可以使用fs.stat(),它返回的是一個Stat對象,能告訴我們文件或者目錄的詳細信息。
'use strict'
const fs = require('fs')
fs.stat('test.txt', function(err, stat){
if(err){
console.log(err)
} else {
// 是否是文件
console.log('isFile:' + stat.isFile())
// 是否是目錄
console.log('isDir' + stat.isDirectory())
if(stat.isFile()){
// 文件大小
console.log('size:' + stat.size)
// 創建時間
console.log('crateTime:' + stat.birthtime)
// 修改時間
console.log('modifiedTime:' + stat.mtime)
}
}
})
運行結果如下:
isFile: true
isDirectory: false
size: 181
crateTime: Fri Dec 11 2015 09:43:41 GMT+0800 (CST)
modifiedTime: Fri Dec 11 2015 12:09:00 GMT+0800 (CST)
stat也有一個同步的方法,這里就不多做敘述了。
由于Node.js環境執行的JavaScript代碼是服務器代碼,所以,絕大多數需要在服務器執行復雜的邏輯代碼,所以必須使用異步代碼,否則,同步代碼在執行時,服務器停止響應,因為JavaScript只有一個執行線程。