2013-05-17 10 views
8

JavaおよびC#には、ストリームをバッファリングするためのクラスがいくつかあります。 BufferedStream(C#、Buffered(Input|Output)StreamおよびBuffered(Reader|Writer))です。バッファリングされたストリームの仕組みは?

コンストラクタでストリームを取得し、同じインターフェイスを実装します。

質問は - どのように動作するのですか?

1バイトを読み込もうとしたらどうなりますか?それは、内部バッファに多くのバイトを読み込んだ後、それをバイト後に私に返しますか? 1バイトの書き込み時?内側のバッファに書き込み、flush()で内部ストリームに書き込みますか?

バイトの配列の読み書きについて - バッファ内のストリームでそれを行うのは効率的ではありませんか?

答えて

2

内部バッファに大量のバイトを読み込んだ後、それをバイト後に私に返しますか?

基本的にはいです。ディスクプラッタやTCPストリームからデータを要求するには時間がかかります。そのため、ソースから個別に取得するのではなく、一度にバイト全体を取得する方が効率的です。

+0

バッファリングされたストリームは、大量のバイトを読み込み、バッファに読み込むことを考えずにバイトをバイトごとに読み込みたい場合に便利です。私のバッファにバイトの配列を手動で読み込みたいのであれば、無駄です。 – VorobeY1326

+2

バッファ付きストリームは、データソースに要求オーバーヘッドがあり、要求数を制限したい場合に便利です。ハードドライブは完全に回転するのに約1/120秒かかるので、文字単位で120文字を検索すると、最悪の場合は1秒かかることがあります。しかし、すべての120文字を一度に取得する場合は、1回の回転で行うことができます。確かに、独自のバッファを作成することはできますが、なぜホイールを再構築するのでしょうか? –

+2

.NETのFileStreamは、すでにハードディスクで使用するために十分にバッファされていることに注意してください。ソケットからTCPパケットを読み取っているのであれば、 'BufferedStream'が必要です。 –