2010-12-28 4 views
5

私は大きなファイルを持っています(英語のWikipedia記事データベースのみをXMLファイルとして扱います)。私はBufferedReaderを使って一度に1文字を読んでいます。擬似コードは:EOFを決定するために、whileループ内のBufferedReader準備メソッド?

file = BufferedReader... 

while (file.ready()) 
    character = file.read() 

これは実際に有効ですか?またはreadyは、HDDがデータを返すのを待っているときにfalseを返すだけです。実際にはEOFに達していませんか?私はif (file.read() == -1)を使用しようとしましたが、文字通り見つけることができなかった無限ループに遭遇したようです。

私の統計では、444,380のウィキペディアのページが読み込まれていますが、もっと多くの記事があると思っているので、ファイル全体を読み込んでいるのかどうか疑問に思っています。

答えて

2

これは、入力全体を読み取ることが保証されていません。 ready()は、基本となるストリームにコンテンツが用意されているかどうかを伝えます。たとえば、ネットワークソケットやファイルを介して抽象化している場合、利用可能なバッファされたデータがないことを意味する可能性があります。

9

Reader.ready()メソッドは、ファイルの終わりをテストするために使用することを目的としていません。むしろ、read()の呼び出しがブロックするかどうかをテストする方法です。

EOFに達したことを検出する正しい方法は、readコールの結果を調べることです。例えば

一度に文字を読んでいる場合は、read()方法を使用すると、ファイルの終わりに達した場合は、有効な文字または-1のどちらかになりますintを返します。したがって、コードは次のようになります。

int character; 
while ((character = file.read()) != -1) { 
    ... 
} 
関連する問題