BufferReader buf = new BufferedReader(FileReader());
これは、ディスクからファイルを1行ずつ読み取っていると思います。これの利点は何ですか?
ではない正確に。サイズがデフォルトのバッファサイズ(8kバイトだと思います)のチャンクでファイルを読み取っています。
利点は、巨大なファイルを読み取るために巨大なヒープを必要としないことです。最大ヒープ サイズは JVM の起動時 (Hotspot Java を使用) にしか指定できないため、これは重大な問題です。
また、巨大なヒープを表すためにシステムの物理/仮想メモリ リソースを消費することもありません。
ファイルをメモリに直接ロードする利点は何ですか?
これにより、システム コールの数が減り、ファイルの読み取りが速くなる可能性があります。どれだけ速くなるかは、多くの要因によって異なります。そして、非常に大きなファイルを扱うという問題があります。
Java でそれを行うにはどうすればよいでしょうか。
- ファイルのサイズを調べます。
- 十分な大きさのバイト (または文字) 配列を割り当てます。
- 関連する
read(byte[], int, int)
またはread(char[], int, int)
メソッドを使用して、ファイル全体を読み取ります。
メモリ マップト ファイルを使用することもできBuffer
ます。
Scanner または RandomAccessFile メソッドの例をいくつか見つけました。ファイルをメモリにロードしますか?
いいえ、いいえ。
それらを使用する必要がありますか?2つのうちどちらを使用すればよいですか?
必要な機能を提供していますか? テキストベースのデータを読み取り/解析する必要がありますか? バイナリ データに対してランダム アクセスを行う必要がありますか?
通常の状況では、主に必要な機能に基づいて I/O API を選択し、次にパフォーマンスの考慮事項に基づいて I/O API を選択する必要があります。読みながら解析するつもりであれば、通常はBufferedInputStream
orを使用するBufferedReader
だけで許容できるパフォーマンスを得ることができます。(ただし、実際にファイル全体を元の形式でメモリに保持する必要がある場合は、BufferedXxx
ラッパー クラスを使用すると実際には読み取りが少し遅くなります。)
* -許容できるパフォーマンスは最適なパフォーマンスと同じではないことに注意してください。ただし、クライアント/プロジェクト マネージャーは、最適なパフォーマンスを実現するためにコードを書く時間を無駄にしたくないでしょう...これが規定された要件でない場合。