2011-06-23 7 views
164

私は(Javascriptのソースと同じフォルダにある)test.txtの内容を読んで、このコードを使用してそれを表示しようとしている:なぜNode.jsのfs.readFile()は文字列ではなくバッファを返しますか?

var fs = require("fs"); 

fs.readFile("test.txt", function (err, data) { 
    if (err) throw err; 
    console.log(data); 
}); 

test.txtの内容はnano上に作成された:

テストのNode.js readFileの()

そして、私はこの取得しています:

エンコーディングが指定されていない場合
Nathan-Camposs-MacBook-Pro:node_test Nathan$ node main.js 
<Buffer 54 65 73 74 69 6e 67 20 4e 6f 64 65 2e 6a 73 20 72 65 61 64 46 69 6c 65 28 29> 
Nathan-Camposs-MacBook-Pro:node_test Nathan$ 

答えて

227

the docs:

から、次に生バッファが返されます。

これは、<Buffer ...>の説明です。ファイル名の後ろの2番目のパラメータとして有効なエンコーディングを指定します(例:utf-8)。このような

fs.readFile("test.txt", "utf8", function(err, data) {...}); 
125

は基本的にあなたがエンコーディングを指定する必要が

fs.readFile("test.txt", "utf8", function(err, data) {...}); 

を試してみてください、など。

+8

ドキュメントによると、それは ' "UTF8"'ない '" UTF8です"。 – Marc

21

バッファオブジェクトを返しています。

あなたは、文字列でそれをしたい場合は、data.toString()でそれを変換することができます:

var fs = require("fs"); 

fs.readFile("test.txt", function (err, data) { 
    if (err) throw err; 
    console.log(data.toString()); 
}); 
+6

種類は古いですが、 'buffer.toString()'はutf-8エンコーディングを前提としているため、この解決策は余分なオーバーヘッドを招くことが知られています。したがって、これは@hvgotcodesの答えに(しかし、遅く)同等であるでしょう。 – Brandon

+0

Andzさん、ありがとうございました。 –

8

data変数がBufferオブジェクトが含まれています。次の構文を使用して、ASCIIエンコーディングに変換:

data.toString('ascii', 0, data.length) 
10

非同期:

fs.readFile('test.txt', 'utf8', callback); 

同期:

var content = fs.readFileSync('test.txt', 'utf8');