web-dev-qa-db-ja.com

Node.jsのfs.readFile()が文字列ではなくバッファを返すのはなぜですか?

私はtest.txt(これはJavascriptソースの同じフォルダーにあります)の内容を読み、このコードを使用して表示しようとしています。

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$ 
280
Nathan Campos

ドキュメントから

エンコーディングが指定されていない場合は、生のバッファが返されます。

これは<Buffer ...>を説明するかもしれません。ファイル名の後の2番目のパラメータとして、有効なエンコーディング、たとえばutf-8を指定します。といった、

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

やってみる

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

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

150
hvgotcodes

Bufferオブジェクトを返しています。

文字列にしたい場合は、data.toString()で変換できます。

var fs = require("fs");

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

非同期:

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

同期:

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

これはグーグルで高まってくるので、私は最初の質問についてのいくつかの文脈上の情報を追加したいと思います(強調私のもの):

WhyNode.jsのfs.readFile()は文字列ではなくバッファを返しますか?

ファイルは必ずしもテキストではないため

たとえyoがプログラマとして知っていたとしても:Nodeはあなたが読み込もうとしているファイルの内容がわからない。それはテキストファイルであるかもしれません、しかしそれはちょうど同様にZipアーカイブかJPGイメージであるかもしれません - Nodeは知らない。

テキストファイルを読むのは難しい

たとえNode knewがテキストファイルを読むことになっていたとしても、どの 文字エンコーディング が使われているのかわかりません文字エンコーディング自体はファイルに格納されていないためです。

guess テキストファイルの文字エンコーディングを多少なりとも自信を持って推測する方法はありますが(これはテキストエディタがファイルを開くときに行うことです)、通常はコードを推測に頼らないようにします。あなたの明示的な指示なしに。

救助へのバッファ!

そのため、これらの詳細のすべてを知ることはできず、知ることもできないので、Nodeはその内容について何も想定せずに、バイトごとにファイルを読み取るだけです。

そしてそれが返されるバッファです。生のバイナリコンテンツのための独創的なコンテナです。このコンテンツがどのように解釈されるべきかは開発者としてあなた次第です。

23
Loilo

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

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

非同期的に

fs.readFile('test.txt', 'utf8', function (error, data) {
    if (error) throw error;
    console.log(data.toString());
});
13
ayusha