6

FileInputStreamを使用してオブジェクト(たとえば数バイト)を読み取る場合、基礎となる操作には次のものが含まれますか?

1)ディスクのブロック全体を読み取って、後で別の読み取り操作を実行した場合、ファイルのその部分が最後の読み取り操作で既にフェッチされているため、実際のディスクの読み取りが不要になりますか?

また

2)FileInputStreamはバッファリングを行わず、代わりにbufferedInputStreamを使用して(1)の効果を達成する必要があるため、新しいディスクアクセスが発生しますか?

FileInputStreamはreadシステムコールを使用し、ハードディスクから一連のページのみを読み取るため、何らかのバッファリングを行う必要があると思います。

4

3 に答える 3

7

FileInputStream基盤となるネイティブシステムコールを作成します。ほとんどのOSは、このために独自のバッファリングを行います。したがって、バイトごとに実際のディスクシークは必要ありません。ただし、それでも、ネイティブOS呼び出しを行うにはコストがかかり、コストがかかります。したがって、BufferedStreamが望ましいでしょう。ただし、少量のデータ(たとえば、数バイトまたはkB)を読み取る場合は、OS呼び出しの数にそれほど違いがないため、どちらでも問題ありません。

于 2011-09-14T18:26:22.267 に答える
5

FileInputStreamのネイティブコードはここにあります:そこでバッファリングが行われているようには見えません。OSのバッファリングが開始される可能性がありますが、それが発生した場合に、何らかの形で明示的なインジケータはありません。

于 2011-09-14T18:25:09.607 に答える
1

注意すべき点の1つは、低速接続を介してマウントされたネットワークボリュームから読み取ることです。このためにバッファリングされていないFileInputStreamを使用すると、大きなパフォーマンスの問題が発生しました。ファイルシステムがローカルであったため、開発中にそれをキャッチしませんでした。

于 2011-09-14T18:44:29.107 に答える