2016-03-21 10 views
3

私はイベント駆動型プログラミングのいくつかの基本を学びたいと思っています。だから、私は大規模なバイナリファイルを読み込み、何かをしているが、ブロッキングコールをしないでプログラムを書くことを試みている。私は、次が出ている:ブロッキングループなしでノードjsの大きなバイナリファイルを読み取るには?

var fs = require('fs'); 
var BUFFER_SIZE = 1024; 
var path_of_file = "somefile" 

fs.open(path_of_file, 'r', (error_opening_file, fd) => 
{ 
    if (error_opening_file) 
    { 
     console.log(error_opening_file.message); 
     return; 
    } 

    var buffer = new Buffer(BUFFER_SIZE); 
    fs.read(fd, buffer, 0, BUFFER_SIZE, 0, (error_reading_file, bytesRead, buffer) => 
    { 
     if (error_reading_file) 
     { 
      console.log(error_reading_file.message); 
      return; 
     } 

     // do something e.g. print or write to another file 
    }) 
}) 

私は完全なファイルを読むためにwhileループを配置する必要があります知っているが、上記のコードでは、私は、ファイルのちょうど最初の1024のバイトを読んでいますし、どのように定式化することができませんブロッキングループを使用せずにファイルの読み取りを続行します。どうしたらいい?

答えて

6

代わりにfs.createReadStreamを使用してください。これにより、ファイルの読み込みが終了するまでコールバックが繰り返し呼び出されるため、ブロックする必要はありません。

var fs = require('fs'); 

var readStream = fs.createReadStream('./test.exe'); 
readStream.on('data', function (chunk) { 
    console.log(chunk.length); 
}) 
+0

ご回答いただきありがとうございます。 1回の通話で読み取るデータの量は?この機能はメモリ内の完全なファイルをフェッチしませんか?それはテキストファイルだけを読むことを意味するのではないのですか? –

+1

私は 'readFile'と一度にファイル全体を読み込むのは間違いでした。私は 'createReadStream'を使う答えを編集しました。これはチャンクを返すでしょう。各チャンクは65536バイトです。 'readFile'も' createReadStream'もテキストファイルに限られていません。彼らはどんなタイプのファイルでも読むことができます。 – rgvassar

関連する問題