私は、の概念に精通午前InputStream
、バッファとなぜ彼らは便利です(あなたが例えば、その後のマシンのRAM大きくなる可能性のあるデータで作業する必要がある場合)。
私はないか、と思いましてもInputStream
、実際にすべてのデータを運びます?。でしOutOfMemoryError
転送されてあまりにも多くのデータがある場合に発生することが?
ケース・シナリオ
私は100ギガバイトのファイルを要求し、クライアントからサーバーに接続する場合、サーバはバッファとファイルのバイト、と書くことで、クライアントにバイトを反復処理を開始しますoutputStream.write(byte[])
。クライアントは、読むこと準備ができていないInputStream
何らかの理由で、今を。サーバーは無期限ファイルのバイトを送り続けるのだろうか?そうであれば、しませんoutputstream/inputstream
これらのマシンの1のRAMよりも大きくなりますか?
InputStream
およびOutputStream
実装は、一般的に多くのメモリを使用しないでください。これらの型の中に実際には、単語「ストリーム」の手段ストリームは保持せず、湖と海の間に水を移すことができるのと同じように-それはシーケンシャルにアクセスされるため、それは、データを保持する必要がないこと水自体がたくさん。
しかし、「ストリーム」は、これを説明するための最良の単語ではありません。あなたがサーバからクライアントに、各段階の転送は、データを転送するときので、それは、より多くのパイプのようなものだ背圧をクライアントからの制御率がどのデータで送信されることを。これはどのようにあなたの蛇口のコントロール流量あなたのパイプを通して街のリザーバにすべての方法に似ています。
- クライアントがデータを読み込むと、それはだ
InputStream
だけで、内部(小)のバッファが空であるOSからより多くのデータを要求します。各要求は、転送されるデータの限られた量を可能にします。 - データはOS、独自の内部バッファが空になるから要求され、それは、新しいデータのためにそこにあるどのくらいのスペースについてサーバに通知されます。サーバーは、これだけ多くの(:TCPにおける「フロー制御」と呼ばだと送信できhttps://en.wikipedia.org/wiki/Transmission_Control_Protocol#Resource_usageを)
- クライアントがそれを受信するためのスペースを持っている場合、サーバー側では、サーバ側のOSは、独自の内部バッファからデータを送信します。独自の内部バッファが空になると、それはより多くのデータを再記入し、それに書き込み処理することができます。
- その秒)(サーバー側のプロセスの書き込みとして
OutputStream
、OutputStream
OSに書き込みデータにしようとします。OSのバッファがいっぱいになると、サーバー側のバッファが新しいデータを受け入れるためのスペースを持ってまで、それはサーバプロセス待ちを行います。
低速のクライアントがサーバ・プロセスは非常に長い時間がかかることができますことに注意してください。サーバーを書いている、とあなたがクライアントを制御しない場合、それはこのことを考慮すると、長いデータ転送が行われている間縛られ、サーバ側のリソースの多くは存在しないことを確実にするために非常に重要です。