2011-02-06 15 views
4

私は15GBのログレコードファイルを持っていると仮定し、このファイルから\ n終了行を繰り返し処理したいと思います。どのJava標準のlib /サードパーティがこの操作のためのきれいなインターフェースを提供するかファイルから文字列行を読み込む効率的なメソッド

この質問How do I create a Java string from the contents of a file?でデモされているように、メモリマップされたファイルアクセス方法を使用してNIOベースのソリューションを探していますので、返す前にメモリ全体にバイトバッファをロードしていないとよいでしょう。バッファの新しいString()インスタンスこのアプローチは、入力のサイズのためにこの場合には機能しません。

ありがとう、
マキシム。

答えて

4

BufferedReaderを使用したことがありますか?ドキュメントから:

は、文字、配列、行の効率的な読み取りのために提供をバッファリングすることによって、文字型入力ストリームからテキストを読み込みます。

それは\n - 末端の文字列(BufferedReader.readLine())を取得するためのクリーンなインターフェイスを持っており、それがバッファリングされているので、かなり効率的でなければなりません。

+1

+1:ボトルネックは、ディスクから15 GBのファイルを読み取るのにかかる時間です。あなたはどうやってそうするのかは大したことではありません。だからシンプルに保つのが最善です。 –

+1

@Peter Lawrey、良い点。もっと同意できません。 – aioobe

3

IMHOこのタスクにはNIOは必要ありません。

BufferedReader reader = new BufferedReader(new FileReader("myfile.log"));

次に、ユーザーreader.readLine():通常のBufferedReaderのを使用してください。

2

NIOベースではありませんが、Guavaの方法CharStreams.readLines(InputSupplier, LineProcessor)をご覧ください。それはあなたが欲しいものをします:

これはコールバックを使用して、ファイル内の各行を順番に処理できるようにします。あなたが現在の行を処理するまで、次の行をメモリにロードしません。行を読み込むときに単一の結果オブジェクトを作成したくない場合は、単にLineProcessor<Void>を使用し、getResult()を返すのはnullです。