10

私は2つのステップでnodejsでファイルの書き込みを使用しました:

1.まず、ファイルが存在するかどうかを判断し、fs.exists関数を使用します。

fs.writeFile2.次に、ファイルを直接書き込むために使用します。

しかし、ファイルの書き込みに使用される関数がもっとあることに気づきました。たとえば、書き込み中にファイルを開いたり閉じたりするためにこれらを使用する必要がありますかfs.openfs.close

fs.createReadStreamその上、私はそこに機能があることに気づきました、それらととfs.createWriteStreamの違いは何ですか?fs.writeFilefs.readFile

4

1 に答える 1

31

違いを説明する方法は次のとおりです。

低レベル:

fs.openfs.closeはファイル記述子で機能します。これらは低レベルの関数であり、open(2) BSDシステムコールへのマップコールを表します。ファイル記述子があるので、これらをfs.readまたはfs.writeで使用します。

これらはすべて非同期であり、同期バージョンもあることに注意してください:fs.openSyncfs.closeSyncfs.readSyncfs.writeSync、ここではコールバックを使用しません。非同期バージョンと同期バージョンの違いはfs.openSync、ファイルを開く操作が完了したときにのみ返されるのに対し、fs.openすぐに返されるため、コールバックでファイル記述子を使用することです。

これらの低レベルの関数は完全な制御を提供しますが、より多くのコーディングを意味します。

中級レベル:

fs.createReadStreamfs.createWriteStreamは、イベントに接続できるストリームオブジェクトを作成します。これらのイベントの例は、「data」(データのチャンクが読み取られたが、そのチャンクはファイルの一部にすぎない場合)または「close」です。これの利点は、ファイルを読み取ってデータが入ってくるときに処理できることです。つまり、ファイル全体を読み取ってメモリに保持してから処理する必要がありません。これは、大きなファイルを処理する場合に意味があります。ファイル全体(たとえば、メモリ内の1GBファイル全体)を処理するよりも、ビットをチャンクで処理する方がパフォーマンスが向上するためです。

高いレベル:

fs.readFilefs.writeFileはファイル全体を操作します。したがって、を呼び出すとfs.readFile、ノードはファイル全体を読み取り、コールバックでデータ全体を表示します。これの利点は、(ストリームを使用する場合のように)異なるサイズのチャンクを処理する必要がないことです。書き込むとき、ノードはファイル全体を書き込みます。このアプローチの欠点は、読み取り/書き込み時にファイル全体をメモリに保存する必要があることです。たとえば、ログファイルを変換する場合、必要なのはデータ行だけです。ストリームを使用すると、書き込みを開始する前にファイルが完全に読み込まれるのを待たずにこれを実行できます。

また、コールバックを使用しないfs.readFileSyncfs.writeFileSyncもありますが、読み取り/書き込みが終了するのを待ってから戻ります。これを使用する利点は、小さなファイルの場合、ファイルが戻る前に何もしたくない場合があることですが、大きなファイルの場合、ファイルI/Oが終了するのを待っている間にCPUがアイドル状態になることを意味します。

それが理にかなっていて、あなたの質問に答えてくれることを願っていfs.writeFileます。fs.openfs.close

于 2012-08-14T09:11:54.123 に答える