異步讀取文件
按照js的標(biāo)準(zhǔn),異步讀取一個(gè)文本文件的格式如下:
'use strict'
const fs = require('fs')
fs.readFile('test.txt', 'utf-8', function(err, data){
if(err){
cconsole.log(err)
}else{
console.log(data)
}
})
請(qǐng)注意蛉加,test.txt文件必須在當(dāng)前目錄下曹步,且文件編碼必須為utf-8
如果我們讀取的文件不是文本文件径荔,而是二進(jìn)制文件,怎么辦呢颠黎?
下面演示如何讀取一個(gè)圖片文件:
'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')
}
})
當(dāng)讀取二進(jìn)制文件時(shí)另锋,不傳入文件編碼時(shí),回調(diào)函數(shù)的data參數(shù)將返回一個(gè)buffer
對(duì)象狭归。在Node.js中夭坪,buffer
對(duì)象可以和String
做轉(zhuǎn)換,例如过椎,把一個(gè)buffer
轉(zhuǎn)化成String
:
var text = data.toString('utf-8')
把String
轉(zhuǎn)化為Buffer
var buf = new Buffer('text', 'uft-8')
同步讀取文件
fs
模塊也提供相應(yīng)的同步讀取文件函數(shù)室梅。與異步相比,多了一個(gè)Sync后綴,并且不接受回調(diào)函數(shù)亡鼠,函數(shù)直接返回結(jié)果赏殃。
用fs
模塊同步讀取文件如下:
'use strict'
const fs = require('fs')
var data = fs.readFileSync('test'.txt, 'utf-8')
如果同步讀取文件失敗,則需要使用try...catch
捕獲該錯(cuò)誤间涵。
try{
var data = fs.readFileSync('test.txt', 'utf-8')
}catch(err){
// 出錯(cuò)了
}
寫文件
例如:
'use strict'
const fs = require(''fs)
fs.writeFile('test.txt', data, function(err){
if(err){
console.log(err)
}else{
console.log('ok')
}
})
writeFile
方法的參數(shù)依次是文件名仁热,數(shù)據(jù)和回調(diào)函數(shù)。如果傳入的數(shù)據(jù)類型是String
勾哩,默認(rèn)按UTF-8
編碼寫入文件抗蠢,如果傳入的數(shù)據(jù)類型是Buffer
,則寫入的是二進(jìn)制文件钳幅∥矧回調(diào)函數(shù)只關(guān)心成功與否,因?yàn)樾枰粋€(gè)err
參數(shù)敢艰。
和 readFile
類似诬乞,writeFile
也有一個(gè)同步的方法,叫writeFileSync
钠导,例如:
const data = 'Hello,Node.js'
writeFileSync('test.txt', data)
stat
如果我們要獲取文件的大小震嫉,創(chuàng)建時(shí)間等信息,可以使用fs.stat()牡属,它返回的是一個(gè)Stat對(duì)象票堵,能告訴我們文件或者目錄的詳細(xì)信息。
'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)
// 創(chuàng)建時(shí)間
console.log('crateTime:' + stat.birthtime)
// 修改時(shí)間
console.log('modifiedTime:' + stat.mtime)
}
}
})
運(yùn)行結(jié)果如下:
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也有一個(gè)同步的方法逮栅,這里就不多做敘述了悴势。
由于Node.js環(huán)境執(zhí)行的JavaScript代碼是服務(wù)器代碼,所以措伐,絕大多數(shù)需要在服務(wù)器執(zhí)行復(fù)雜的邏輯代碼特纤,所以必須使用異步代碼,否則侥加,同步代碼在執(zhí)行時(shí)捧存,服務(wù)器停止響應(yīng),因?yàn)镴avaScript只有一個(gè)執(zhí)行線程担败。