web-dev-qa-db-ja.com

BufferedReaderで行を読み取り、ファイルの終わりを確認する

私のコードに次のようなものがある場合:

String line = r.readLine();  //Where r is a bufferedReader

次の行がファイルの最後にある場合、どうすればクラッシュを回避できますか? (つまり、null)

次の行を読む必要があります。対処する必要があるものがあるかもしれませんが、コードがなければクラッシュするだけです。

そこに何かがあれば、すべては大丈夫ですが、そこに何かがあることを保証することはできません。

だから次のようなことをしたら:(疑似コード):

if (r.readLine is null)
//End code

else {check line again and excecute code depending on what the next line is}

このような問題は、nullに対して行をチェックすると、すでに次の行に移動しているので、再度確認するにはどうすればよいかということです。

私はこれを行う方法を考え出していない-提案は大いに役立つだろう。

11
Zippy

Am ...このような構造を単純に使用できます。

String line;

while ((line = r.readLine()) != null) {
   // do your stuff...
}
30
Andremoniy

以下を使用して、ファイルの終わりを確認できます。

public bool isEOF(BufferedReader br)  
{
     boolean result;

     try 
     {
         result = br.ready();
     } 
     catch (IOException e)
     {
         System.err.println(e);
     }
     return result;
}
5

すべての行をループする場合は、次を使用します。

while((line=br.readLine())!=null){
    System.out.println(line);
}
br.close();
4
Lugaru

あなたの場合、そこに何かがあるかもしれないので、次の行を読むことができます。何もなければ、コードはクラッシュしません。

String line = r.readLine();
while(line!=null){
   System.out.println(line);
   line = r.readLine();
}
2
Sushant Somani

そもそも、「Functional Programming Approach」を使用してみませんか?とにかく、新しいメソッドlines()Java 1.8以降に追加されました。BufferedReaderStreamとしてコンテンツを返します。 。ファイルからすべての行をストリームとして取得し、ロジックに基づいて文字列をソートし、リスト/セットで同じものを収集して出力ファイルに書き込むことができます。同じアプローチを使用する場合、NullPointerExceptionについて心配する必要はありません。以下は同じためのコードスニペットです:-

import Java.io.IOException;
import Java.io.PrintWriter;
import Java.nio.file.Files;
import Java.nio.file.Paths;
import Java.util.stream.Collectors;

public class LineOperation {
    public static void main(String[] args) throws IOException {
            Files.newBufferedReader(Paths.get("C://xyz.txt")).
            lines().
            collect(Collectors.toSet()). // You can also use list or any other Collection
            forEach(System.out::println);
    }

}
1
Abhinav