質問

1)緩衝型のストリームはバックグラウンドでどのように機能しますか、それらは通常のストリームとどのように異なり、それらを使用することの利点は何ですか?

2) DataInputStream また〜だ バイト ベース。しかし、それは方法を持っています readLine(). 。ここのポイントは何ですか?

役に立ちましたか?

解決

BufferedInputStream Javadocから:

BufferedInputStreamは、別の入力ストリームに機能を追加します。つまり、入力をバッファリングし、マークとリセットのメソッドをサポートする機能です。 BufferedInputStreamが作成されると、内部バッファアレイが作成されます。ストリームからのバイトが読み取られるかスキップされるため、内部バッファーは、含まれる入力ストリームから必要に応じて、一度に多くのバイトを補充します。マーク操作は、入力ストリームのポイントを覚えており、リセット操作は、最新のマーク操作が含まれているため、新しいバイトが含まれる前に再読み込まれるため、すべてのバイトが読み取られます。

内部的には、バッファアレイが使用され、基礎となる入力ストリームから個別にバイトを読み取る代わりに、バッファを埋めるのに十分なバイトが読み取られます。これにより、基礎となる入力ストリームでの読み取り値が少ないため、パフォーマンスが速くなります。

その場合、bufferedOutputStreamには逆のことが当てはまります。

mark()およびreset()は次のように使用できます。

1 BufferedInputStream bis = new BufferedInputStream(is);
2 byte[] b = new byte[4];
3 bis.read(b); // read 4 bytes into b
4 bis.mark(10); // mark the stream at the current position - we can read 10 bytes before the mark point becomes invalid
5 bis.read(b); // read another 4 bytes into b
6 bis.reset(); // resets the position in the stream back to when mark was called
7 bis.read(b); // re-read the same 4 bytes as line 5 into b

マークを説明する/リセットするには...

BufferinputStreamは、バッファ内の現在の位置を内部的に記憶しています。バイトを読むと、位置が増加します。マーク(10)への呼び出しは、現在の位置を保存します。その後の読み取りコールは現在の位置を増加させ続けますが、リセットする呼び出しは、マークが呼び出されたときに現在の位置をその値に戻します。

マークの引数は、マーク位置が無効になる前にマークを呼び出した後に読むことができるバイトの数を指定します。マーク位置が無効になったら、リセットを呼び出して戻ることができなくなります。

たとえば、Mark(2)が4行目の上の4行目で使用されていた場合、IOExceptionは、2バイト以上を読んでからマークの位置が無効になるため、6行6でreset()が呼び出されるとスローされます。

他のヒント

バッファリングされたリーダー/ライター/inputstreams/outputstreams最適化のために大きなチャンクでOSを読み書きします。作家と出力ストリームの場合、データは大きな塊を書き出すのに十分な収集が得られるまでメモリにバッファリングされます。読者とinputstreamsの場合、大きなチャンクはフォームディスク/ネットワーク/...バッファーに読み取り、バッファが空になるまでそのバッファーからすべての読み取りが行われ、新しいチャンクが読み取られます。

DatainputStreamは確かにバイトベースです。 ReadLineメソッドは非推奨です。内部的には、完全なラインを収集するまで、ディスク/ネットワーク/...バイトフォーバイトからバイトを読み取ります。したがって、このストリームは、bufferedinputStreamをソースとして使用してスピードアップできます。これにより、ラインのバイトはディスクから直接ではなくメモリバッファーから読み取られます。

非バッファーI/Oでは、各読み取りまたは書き込み要求がオペレーティングシステムに直接渡されます。 JavaのバッファリングされたI/Oストリームは、データを独自のメモリバッファー(通常はバイト配列)に読み取りおよび書き込みします。オペレーティングシステムへの呼び出しは、バッファが空の場合(読み取りの場合)、またはバッファーがいっぱい(書き込みの場合)の場合にのみ行われます。アプリケーションの重要なポイントの後、バッファーを手動でフラッシュすることをお勧めします。

オペレーティングシステムAPI呼び出しは、ディスクアクセス、ネットワークアクティビティなどにつながる可能性があるため、これは非常に高価になる可能性があります。バッファーを使用して、ネイティブオペレーティングシステムI/Oをより大きなチャンクにバッチすると、多くの場合、パフォーマンスが大幅に向上します。

バッファリングストリームは、より大きなチャンクでデータを書き込んだり読んだ バッファリング. 。基礎となるストリームに応じて、これによりパフォーマンスが劇的に向上する可能性があります。

から Java.io.BufferedOutputStream's javadocs:

このような出力ストリームを設定することにより、アプリケーションは、書かれた各バイトの基礎となるシステムへの呼び出しを必ずしも引き起こすことなく、基礎となる出力ストリームにバイトを書き込むことができます。

この種のオーバーヘッドを減らすために、JavaプラットフォームはバッファリングされたI/Oストリームを実装します。バッファリングされた入力ストリームは、バッファーとして知られるメモリ領域からデータを読み取ります。ネイティブ入力APIは、バッファが空の場合にのみ呼び出されます。同様に、バッファされた出力ストリームはデータをバッファーに書き込み、ネイティブ出力APIはバッファがいっぱいの場合にのみ呼び出されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top