web-dev-qa-db-ja.com

BufferedReaderのバッファーサイズは?

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

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文字だけを読み取ることを意図していたので、何を意味しますか。しかし、そうではありませんでした。

23
codeomnitrix

名前が示すとおり、BufferedReaderは入力をバッファします。これは、入力ソースからバッファに渡してからバッファに渡すことを意味します。ここでのバッファサイズは、バッファするバイト数を指します。

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

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

33
marcog

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

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

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

11
user1923551

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

巨大なバッファサイズを使用する場合、RAM必要ありません。小さなサイズを使用する場合、ファイルリクエストのためにカーネルを常にバグ報告します。デフォルトを許可することをお勧めします。ほとんどのマシンは、一度に1つのセクターまたは整数のセクターを読み取ります。セクターサイズは、マシンのフォーマット方法によって異なります。

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

10
ncmathsadist