0

ストリームと I/O に関する Java チュートリアルを読んでいます。私が言う声明に出くわしたところ..

Buffered input streams read data from a memory area known as a buffer; the native input API is called only when the buffer is empty. Similarly, buffered output streams write data to a buffer, and the native output API is called only when the buffer is full.

ソースはこちら

ここで、バッファが空の場合にのみネイティブ API が呼び出されるのはなぜですか? もしそうなら、空のバッファでAPIを呼び出す必要は何ですか?

4

2 に答える 2

2

これまで見てきた例のほとんどは、バッファリングされていない I/O を使用しています。これは、各読み取りまたは書き込み要求が、基盤となる OS によって直接処理されることを意味します。これにより、プログラムの効率が大幅に低下する可能性があります。これは、このような各要求が、ディスク アクセス、ネットワーク アクティビティ、または比較的コストのかかるその他の操作をトリガーすることが多いためです。

同じドキュメントのこのステートメントは、あなたの質問に答えます。ネイティブ API は、入出力タスクを実行するために OS で使用できる OS の API です。プログラミング言語は、これらの API とやり取りするための OS の上のレイヤーであり、これらのネイティブ API を効率的に使用するためにバッファリングされたストリームが作成されます。

以下のコメントで MadProgrammer が言及しているように、ネイティブ API はバッファーが空の場合にのみ呼び出されます。

1-結果はメモリにバッファリングされ、メモリ(またはRAM)に何もバッファリングされていない場合、ハードディスクなどのリソースにアクセスするにはネイティブ呼び出しが必要であるため

2-オーバーヘッドを削減する。ネイティブ呼び出しはコストのかかる操作です

于 2013-07-26T05:12:53.357 に答える
1

JVM はネイティブ メソッドを呼び出して、オペレーティング システムにファイル システムからデータを取得するように要求する必要があります。これは、バッファリングされたストリームだけでなく、すべての入力に適用されます。オペレーティング システムにデータをファイル システムに入れるように要求するには、ネイティブ メソッドが必要です。

于 2013-07-26T05:02:02.207 に答える