Part7:ストリームとファイル入出力

穂乃果「FinalLoveLive!だよっ!」
ことり「FinalLoveLive!だね♪」
穂乃果「いやー、花陽ちゃんもびっくりのドーム公演だよ~。うんうん、思えば遠くへ来たものだ」
海未「まあ、ここでの勉強はファイナルが終わっても淡々と続く予定ですが(ネタが枯渇しなければ)」
ことり「そうなんだ。ちょっとほっとしたかな・・・」
海未「少しずつAqoursの皆さんにも登場願うことにはなりますが、それによってラブライブ!の世界が広がるのはよいことです」


海未「さて、難解なイベントループが片付いたところで、今回は入出力系の話です」

海未「最初はストリームについてです。これは、ネットワークやコンソール、ファイルなどの読み込みや書き込みを行う機構です」
穂乃果「なんか実用的な感じがしてきた!」
海未「そうですね。ファイルやネットワークの入出力は、Node.jsでは頻繁に使いますから」

海未「これまで見てきた中では、おなじみのcreateServerで扱ったHTTPリクエストやHTTPレスポンスはいずれもストリームです」
ことり「ネットワークの入出力をしてるからかな」
海未「はい。ストリームにはReadableWritableDuplexがあり、リクエストはReadable、レスポンスはWritableのサブクラスです」
穂乃果「えーと・・・」
海未「英語の苦手な穂乃果のために補足しておくと、Readableは読み取り用、Writableは書き込み用、Duplexは両方が可能なストリームです」

海未「これらのストリームはいずれもEventEmitterのインスタンスです。入出力の状態に応じてイベントが発生するので、それに対するリスナーを登録することができます」
穂乃果「EventEmitterはさすがに覚えてるよ」
海未「Readableでは以下のイベントが発生します」

  • data
    • データが読み込まれたとき
  • end
    • データの読み込みが全て終わったとき
  • close
    • ストリームが閉じられたとき
  • error
    • 読み込み中にエラーが発生したとき

海未「Writableで発生するイベントは以下です」

  • drain
    • 書き込みが追いつかない場合に、追加で書き込みを行えるようになったとき
  • finish
    • データの書き込みが全て終わったとき
  • pipe
    • ReadablepipeメソッドによりReadableと接続されたとき
  • unpipe
    • ReadableunpipeメソッドによりReadableから切り離されたとき
  • error
    • 書き込み中にエラーが発生したとき

海未「Duplexは両方のイベントが発生します」
ことり「このイベントのリスナーの中で、データを扱っていけばいいんだね」
海未「一般的に、ReadableではdataendWritableではdrainpipeあたりを使うことが多いでしょう」

海未「試しにファイルを読んでみましょう。まずこんなファイルを用意します」

ユメノトビラ
Snow halation
KiRa-KiRa Sensation!
僕らは今のなかで

海未「そのファイルを読むコードはこんな感じです」

海未「実行すると、出力はこうなります」

ユメノトビラ
Snow halation
KiRa-KiRa Sensation!
僕らは今のなかで
end

穂乃果「おおっ、いい感じだね!」

海未「次に、ファイルに書き込んでみましょう」

ユメノトビラ
Snow halation
KiRa-KiRa Sensation!
僕らは今のなかで

海未「コンソールにはfinishと表示されますね」

海未「このReadableWritableをつなげるパイプという仕組みがあります。Readableから読んだデータをWritableに書き込むものです」

海未「ファイルの中身がそのままコピーされたと思います」
ことり「うん、中身そのままのファイルができてるね」
海未「ネットワークから読み込んだデータをファイルに流し込んだり、ReadableWritableを自分で実装したオブジェクトを用意してデータを加工したり、といった使い方をします」


海未「ストリームを使わないファイル入出力の仕組みもあるので、そちらも見てみましょう」

ユメノトビラ
Snow halation
KiRa-KiRa Sensation!
僕らは今のなかで

海未「一見、先ほどと同じように読み込めていますね」
穂乃果「一見?」
海未「実はReadableと使う場合とreadFileを使う場合で、データを読み込む単位が異なるのです」
穂乃果「どういうこと?」
海未「readFileでは、全てのデータを一度に読み込みます。一方ストリームを使った場合、データは細切れの状態で何回かに分けて読み込まれます」
ことり「その都度イベントが発生するってことなんだよね。でも、どうして?」
海未「メモリの消費量と、一回の入出力にかかる時間だと思います。今回のサンプル程度だとどちらも同じなのですが、データ量が多くなるとreadFileはメモリを圧迫しますね」
ことり「そっか、だからストリームは負荷のかからない程度に分割してるんだね」


海未「ファイルに関しては、基本的な入出力はできるようになったと思います。次回からはネットワーク周りを見ていきましょう」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です