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


378

の内容を読もうとしています 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$ 

回答:


561

ドキュメントから

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

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

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

164

試す

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

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


66

これはGoogleで高く評価されるため、元の質問に関するいくつかのコンテキスト情報を追加したいと思います(強調は私のものです)。

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

ファイルは常にテキストであるとは限らないため

あなたがプログラマーとしてそれを知っていたとしても:Nodeはあなたが読み込もうとしているファイルの中に何があるか全く分かりません。テキストファイルの場合もありますが、ZIPアーカイブやJPG画像の場合もあります。ノードにはわかりません。

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

Node テキストファイルを読み取ることを知っいたとしても、文字エンコーディング自体はファイルに格納されていないため、どの文字エンコーディングが使用されるか(つまり、ファイル内のバイトが人間が読める文字にどのようにマッピングされるか)はわかりません。 。

テキストファイルの文字エンコードをある程度自信を持って推測する方法はいくつあります(ファイルを開くときにテキストエディターが行うことです)が、通常、明示的な指示なしにコードが推測に依存することは望ましくありません。

救助のためのバッファ!

したがって、これらの詳細のすべてを把握していないため、Nodeは内容について何も想定せずに、ファイルを1バイトずつ読み取ります。

そして、それが返されるバッファーです。生のバイナリコンテンツ用のピノピネーションされていないコンテナーです。このコンテンツをどのように解釈するかは、開発者としてのあなた次第です。


10
これは、タイトルの質問に実際に回答する唯一の回答です。
frzsombor

4
@frzsombor受け入れ答えがあることを考えると、私は本当にOP前提と思いました代わりに、バッファの文字列を得ることに興味を持ってをし、ちょうどフレーズの質問権をできませんでした。それにもかかわらず、他の人々が実際の「理由」を念頭に置いてGoogleからここに来る可能性があるため、私の答えです。:)
Loilo

44

非同期:

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

同期:

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

38

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

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

var fs = require("fs");

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

13
古いものですが、buffer.toString()とにかくutf-8エンコーディングを想定しているため、このソリューションでは追加のオーバーヘッドが発生することを知っておく必要があります。したがって、これは@hvgotcodesの回答と同等です(ただし、それよりも低速です)。
ブランドン

14

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());
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.