2011-11-11 15 views
0

こんにちはすべて私は持ってこのようになりますローカルfileテキストファイルの行数はどのようにして決定されますか?

AAA Anaa 
AAC EL-ARISH 
AAE Annaba 
AAF APALACHICOLA MUNI AIRPORT 
AAG ARAPOTI 
AAL Aalborg Airport 
AAM Mala Mala 
AAN Al Ain 
AAQ Anapa 
AAR Aarhus Tirstrup Airport 
AAT Altay 
AAX Araxa 
AAY Al Ghaydah 
... 

Java Tutorialsjava.io.File.length を行うと、50

で結果を分割することにより、ファイルの行数を推定示唆していないが、テキストファイルの行数を取得するためのより「強固な」方法があります(ただし、ファイル全体を読み込むオーバーヘッドを支払う必要はありません)。

答えて

2

あなたが持っている推定アルゴリズムの利点は、それは非常に高速であるということです。ファイルの大きさや大きさにかかわらず、同じ長さの時間とメモリが必要になります。しかし、それは膨大な数のインプットにも大いに間違っています。

特定の数字を取得する最も良い方法は、ファイル全体を実際に読み取って、'\n'文字を探し出すことです。大規模なバイナリブロック(16384バイトまたはそれより大きな2の累乗)でファイルを読み込み、興味のある特定のバイトを探すと、ディスクIOの帯域幅に近づく可能性があります。

+0

Jonathonが提案する解決法と比較すると、 '\ n'文字を探すファイル全体を読むほうが速いということですか? – Pacerier

+0

Jonathonと私は非常に似た答えを出しました - 彼がJavaのライブラリにすべてのバッファリングを行い、あなたのために ''\ n' 'を探すことを許可していることを除けば、これは素晴らしいアイデアです。 – sarnold

8

FileReaderのファイルを読み込んで、読み込んだ行数を数えることはできませんか? 1つのstat(2)呼び出し、その後、いくつかの部門:

int lines = 0; 
BufferedReader br = new BufferedReader(new FileReader("foo.in")); 
while (br.readLine != null) { 
    lines++; 
} 
+0

しかし、ファイル全体を読み込むためのオーバーヘッドを支払うことなくそれを行う方法はありますか? – Pacerier

+0

いいえ、それ以外の方法はありますか?このファイルは単にバイトのストリームであり、その中には\ nというものがあり、これは行を区切ることを決定します。何も得られない。 –

+0

Btw '\ n'文字を検索しているファイル全体を読むのがreadLines(sarnoldが示唆しているように)を行うより速いと思いますか? – Pacerier

1

各readLine()に対して値1をインクリメントするBufferedReadercounterを使用する必要があります。

関連する問題