2012-05-06 9 views
1

私は、txtファイルの次の行を読み込んで何かをするメソッドを持っています。私はEOFもチェックする必要がある別の方法があります。 2つの方法はループ内で受容的に呼び出されます。readLine()なしでEOFをチェックする方法?

方法1:

trace = br.readLine(); 
    if (trace==null) 
     break; // end of file 

方法2: は、私は同じ技術を使用せずに、EOFをチェックする必要があります。それ以外の場合は、readLineに使用されるptrをインクリメントします。

これを行う方法はありますか?

おかげ

+0

チェックこの質問:http://stackoverflow.com/questions/2517638/can-i-peek-on-a-bufferedreaderとこの回答:http://stackoverflow.com/a/2517713/1227804 – user1227804

答えて

0

あなたは

Scanner sc = new Scanner (file); 

使用し、

while (sc.hasNext()) 

スキャナは

sc.readLine(); 

方法を持って読むことができます。

+0

この一般的な答えは、コードの2箇所でEOFをチェックするOPの特定の要求を解決し始めません。 –

+0

@MarkoTopolnik:間違っている! 'このスキャナが入力に別のトークンを持っている場合、trueを返します。このメソッドは、入力をスキャンするのを待つ間にブロックされることがあります。スキャナは入力を超えて進むことはありません。メソッドを別のポイントで呼び出すことができます。 –

1

これを実現する方法はありますか?

BufferedReader APIではこれを行うことができません(*)。実際にこれを行う必要がある場合は、これを行うためにカスタムのReaderクラスを実装する必要があります。私はPushbackReaderで始まり、readLine()メソッドを追加してから、1つのcharを読み戻してeofテストメソッドを実装します。

* Can I peek on a BufferedReader?の回答を読むと、ready()メソッドがEOFテストとして機能するように見えます。しかし、これは標準のコードベースのready()の現在の実装の成果物であり、メソッドのjavadoc仕様によると間違いです(バグ)。

+0

うーん...ありがとう! –

0

この形式を使用すると、EOF例外を回避することもできます。バッファサイズは早期に決定されるため、エラーは発生しません。

File myFile = new File("path"); 
String completeText = ""; 
FileChannel fc = new FileInputStream(myFile.getAbsoluteFile()).getChannel(); 
ByteBuffer buffer = ByteBuffer.allocate((int)fc.size()); 
fc.read(buffer); 
Charset charset = Charset.defaultCharset(); 
CharsetDecoder decoder = charset.newDecoder(); 
CharBuffer charBuffer = decoder.decode(buffer);  
completeText = charBuffer.toString(); 
buffer.clear(); 
fc.close(); 
関連する問題