2016-10-30 7 views
1

でストリームを使用してデータを読み込むについて私が読んデータについてこの例を見つけ使用してストリームチュートリアル上のノード

var fs = require('fs'); 
var readableStream = fs.createReadStream('file.txt'); 
var data = ''; 

readableStream.on('data', function(chunk) { 
    data+=chunk; 
}); 

readableStream.on('end', function() { 
    console.log(data); 
}); 

私はカップルの質問があります。

1)1はdata+= chunkをしているので、これはチャンクが右の文字列であることを意味し? それ以外の場合、この連結はどのように機能しますか?

2)しかし、1)が真でchunkが文字列の場合、なぜエンコーディングが設定されていないのですか?

3)バイナリファイルを読み込むためにこの例をどのように変更しますか?確かにデータがバイナリの場合、 data+=chunkの連結はこの場合には機能しませんか?

誰かがこの混乱を明確にしてください。

+0

バイナリファイルの場合は、文字列ではなくデータを蓄積するためにBufferオブジェクトを使用します。 – jfriend00

+0

@ jfriend00 okしかし、この例ではデータを文字列として解釈するためにエンコーディングを設定する必要はありませんでしたか? –

答えて

1

fs.createReadStream()はオプションの第2引数を取ります。これは、ストリームを読み取るためのエンコーディングを設定できるオプションオブジェクトです。エンコーディングが設定されていない場合は、デフォルトでutf8 stringになります。ドキュメントにないので、その情報を見つけるのに時間がかかりましたが、それはin the code hereです。

したがって、options引数のプロパティとしてエンコーディングをfs.createReadStream()に渡さないと、デフォルトでutf8になります。バイナリデータを処理したい場合は、エンコーディングをnullに設定することができます。ストリームは通常、ストリームのコンストラクタで通常設定されますが、ストリームは通常、作成後にエンコーディングを変更しないため、.setEncoding(...)メソッドを呼び出してエンコーディングを設定します。

したがって、ストリームのエンコーディングによって、utf8文字列、バッファ、またはその他のエンコーディングタイプのデータを渡すかどうかが決まります。また、エンコード(たとえばバイナリ)がない場合は、新しいデータが利用可能になったときに文字列の代わりにBufferオブジェクトが渡されます。

+0

あなたはバイナリファイルの場合は、チャンクのタイプはバッファになりますか? –

+0

とタイプチャンクは文字列です(ストリームによって文字列に変換されましたか?)私の例ではjavascriptはそれを認識して+ =演算子の正しいオーバーロードを自動的に使いますか? –

+0

@ user200400 - 'chunk'引数がバイナリの場合、Bufferオブジェクトになります。 「チャンク」はutf8エンコードの場合は文字列です。したがって、あなたの例では、通常の文字列操作である2つの文字列を追加するだけです(本当に過負荷ではありません)。 – jfriend00

関連する問題