27

コンストラクターのバッファーサイズの意味は何ですか?

BufferedReader(Reader in, int size)

私がプログラムを書いたように:

import java.io.*;
class bufferedReaderEx{
    public static void main(String args[]){
        InputStreamReader isr = null;
        BufferedReader br = null;
            try{
                isr = new InputStreamReader(System.in);
//              System.out.println("Write data: ");
//              int i = isr.read();
//              System.out.println("Data read is: " + i);
                //Thus the InputStreamReader is useful for reading the character from the stream
                System.out.println("Enter the data to be read by the bufferedReader: ");
                //here isr is containing the lnefeed already so this is needed to be flushed.
                br = new BufferedReader(isr, 2);
                String str = br.readLine();
                System.out.println("The data is : :" +  str);
            }catch(IOException e){
                System.out.println("Can't read: " + e.getMessage());
            }
    }
}

出力:

Enter the data to be read by the bufferedReader: Hello world and hello world again
The data is: Hello world and hello world again

次に、バッファサイズは、2文字のみを読み取ることを意図したとおりに何を意味しますか。しかし、そうではありませんでした。

4

3 に答える 3

37

BufferedReader名前が示すように、入力をバッファリングします。これは、入力ソースからバッファに読み込んでから、バッファに渡すことを意味します。ここでのバッファサイズは、バッファリングするバイト数を指します。

ほとんどのソースからの入力の読み取りは非常に遅いです。プログラムはほとんどの場合入力を待機している可能性が高いため、わずか2バイトのバッファはパフォーマンスを低下させます。バッファサイズが2の場合、100バイトを読み取ると、メモリ内バッファから2バイトを読み取り(非常に高速)、バッファを埋め(非常に低速)、バッファから2バイトを読み取り(非常に高速)、バッファ(非常に遅い)など-全体的に非常に遅い。バッファサイズが100の場合、100バイトを読み取ると、メモリ内バッファから100バイトが読み取られます(非常に高速)。全体的に非常に高速です。これは、読み取り時にバッファに100バイトが含まれていることを前提としていますが、これは、あなたのような場合に合理的な前提です。

何をしているのかわからない場合は、非常に大きいデフォルトのバッファサイズを使用する必要があります。バッファが小さい理由の1つは、バッファがメモリを消費するため、メモリが制限されたデバイスで実行している場合です。

于 2011-01-09T11:58:10.963 に答える
14

http://www.docjar.com/html/api/java/io/BufferedReader.java.html

このJavaのドキュメントによると、デフォルトのバッファサイズは8192文字の容量です。行サイズは80文字の容量と見なされます。

ファイルサイズが小さい場合は、8192バッファサイズで十分です。しかし、これも成長可能です。ファイルに8192文字を超える文字が含まれている場合、bufferedreaderのfillメソッドは、ファイルからコンテンツを読み取る前にバッファーサイズを増やします。より大きなコンテンツファイルの場合は、コンストラクターを介してバッファーリーダーを作成するときに、独自の最大サイズをバッファーに設定することをお勧めします。これにより、メモリを再作成したり、古い配列を新しく作成した配列にコピーしたりする必要がなくなります。

于 2015-06-23T08:11:41.750 に答える
11

ファイルを読み書きするときは、カーネルにアクセスする必要があります。カーネルは実際にファイルにアクセスします。すべてのファイル操作はカーネルを経由する必要があります。これはかなりコストのかかる操作です。バッファリングにより、バイトのチャンクが読み取られます。これらはRAMの一時的な場所に保持され、この場所からバイトが読み込まれます。このようにして、ファイルIOを実行するようにカーネルに頻繁に要求することはありません。

巨大なバッファサイズを使用すると、RAMを不必要に占有することになります。小さなものを使用すると、ファイル要求のためにカーネルを絶えず盗聴することになります。デフォルトを使用できるようにするのが最善です。バッファサイズと実験を指定できます。ほとんどのマシンは、一度に1つのセクター、または整数のセクターを読み取ります。セクターサイズは、マシンのフォーマット方法によって異なります。

次の実験は興味深いものです。1,000,000個のゼロを含むファイルを作成します。OSのタイミング機能を使用して、OSが別のファイルにコピーする速度を確認します(バッファ付きおよびバッファなしのIOを使用してコピープログラムを作成します)。デフォルトを含むさまざまなバッファサイズで時間を計ります。

于 2011-05-30T01:45:32.697 に答える