2017-12-26 51 views
1

メモリから時間のかかる効率的な方法でファイルからUTF-8テキストを読み取ろうとしています。 ノード内のReadStreamから同期して読み取る方法

  • fs.readSyncファイルからバイトのセット量を読んで返します

    • fs.readFileSyncは、ファイル全体を読み込むと、ファイルの内容全体を含むバッファを返します。同期したファイルから直接読み込むには、2つの方法があります。それが最も簡単ですので、私が最初にちょうどfs.readFileSyncを使用しますが、私は効率的に一度にテキストのチャンクで読み取ることにより、潜在的に大きなファイルを扱うことができるようにしたいのですがちょうどその内容

    を含むバッファー。そこで私は代わりにfs.readSyncを使い始めました。しかし、私はfs.readSyncがUTF-8デコードを処理しないことに気付きました。 UTF-8はシンプルなので、手作業でデコードするためにいくつかのロジックを取り上げることができますが、Nodeには既にサービスがありますので、可能ならばそれを避けたいと思います。

    私はfs.createReadStreamを気付きました。この目的のために使用できるReadStreamが返されますが、残念ながら非同期操作モードでしか使用できないようです。

    ReadStreamから同期的に読み取る方法はありますか?私はこれの上に既に大規模なスタックを構築しているので、非同期であることをリファクタリングする必要はありません。

  • +0

    ストリームは非同期です。それを変更することはできません。もちろん、ストリームからファイルハンドルを取得し、 'readSync()'と同期してファイルハンドルを読み取ることもできますが、ストリームのインターフェースをまったく使用していないため、既に試したものより優れていません。 – jfriend00

    +1

    私は、エンコードと 'readSync()'の問題は、ファイルからのバイトの任意の読み込みがマルチバイト文字の配置を知る方法がないため、UTF- 8エンコード。一方、ストリーム、または 'fs.readFileSync()'はファイルの先頭から始まり、アラインメントを保証することができます。 – jfriend00

    +0

    はい、これはまさに問題です。基本的に私は、ファイルから個別にデコードされた文字を読み込む方法を探していますが、同期しています。私が言ったように、私は準備している 'readSync'の上にレイヤーとして自分自身でデコードロジックを実装することができましたが、Nodeのボックスの外でこれが既に可能であるかどうか不思議でした。 – jchitel

    答えて

    0

    私はstring_decoderモジュールを発見しました。このモジュールは、私が書かなければならないと思っていたすべてのUTF-8デコードロジックを処理します。現時点では、私が探していた同期動作を得るために、fs.readSyncの上にこれを使用するのは簡単に思えません。

    あなたは基本的にバイトを送り続けるだけで、文字のデコードに成功すると、それが出力されます。 Node documentationは、どのように動作するかを説明するのに十分です。

    関連する問題