使用BufferedReader读取行并检查文件结束

18

如果我的代码中有类似这样的内容:

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}

我对这样的事情有疑虑,因为当我检查该行是否为空时,它已经移动到下一行,那么我如何再次检查它呢?

我还没有想出解决方法,任何建议都将是极大的帮助。


4
希望有人在踩赞时留下原因。踩赞应该表示问题有些地方存在问题,或许需要重新编辑格式。如果没有说明踩赞的原因,对任何人都没有帮助。请注明踩赞原因,谢谢。 - Zippy
8个回答

48

嗯...您可以简单地使用这样一个结构:

String line;

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

8
既然你回答得比我快,那我就删掉我的回答了 :) - Azad

8
如果您想循环遍历所有行,请使用以下代码:
while((line=br.readLine())!=null){
    System.out.println(line);
}
br.close();

6
您可以使用以下代码来检查文件是否已结束。
public bool isEOF(BufferedReader br)  
{
     boolean result;

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

在我看来,这比在 while 子句中进行赋值和比较要好。 - miyalys
1
这种情况在异常时会默默失败,而 BufferedReader::ready 可能会返回 false,即使下一次读取将成功。 - Adam Peck

2

在你的情况下,您可以阅读下一行,因为可能会有信息。 如果没有任何内容,您的代码将不会崩溃。

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

1
将赋值语句放在while循环之外会让代码更清晰。 - DarkHark

1
首先,为什么不使用“函数式编程方法”呢?无论如何,自Java 1.8以来,已添加了一种新的方法lines(),它使BufferedReader将内容作为Stream返回。它获取文件中的所有行作为一个流,然后您可以根据自己的逻辑对字符串进行排序,然后将其收集到列表/集合中并写入输出文件。如果您使用相同的方法,就不需要担心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);
    }

}

没有必要收集这些行。移除 collect() 调用,对流执行 forEach() - Florian F

1
你可以通过 BufferReader 来完成。我知道这与下面的问题无关,但我会为那些不使用 BufferReader 而使用 Scanner 读取文件的新手提供额外的信息。
除了 BufferReader,你还可以使用 Java 的 Scanner 类来读取文件并检查最后一行。 缓冲读取器
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
       // process the line
    }
}

扫描仪

   try {
     Scanner scanner = new Scanner(new FileReader(file));
         while (scanner.hasNext()) {
            // Above checks whether it has or not ....
            }
       } catch (IOException e) {
            e.printStackTrace();
       }

如果您在多线程环境中使用这个代码片段,可以使用BufferReader,因为它是synchronized的。此外,BufferReaderScanner更快。

0

如果您想进行一些检查,例如:

if (reader.ready())
       stringBuilder.append("#");

你可以使用 ready()。

public static void check() throws IOException {
        InputStream in = new FileInputStream(new File(filePath));
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        StringBuilder stringBuilder = new StringBuilder();
        String line;

        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line);
            if (reader.ready())
                stringBuilder.append("#");
        }
        String returnedString = stringBuilder.toString();
        System.out.println(returnedString);
    }

-4

你可以在循环内刻意抛出错误,例如:

String s = "";
while (true) {
    try {
        s = r.readline();
    }catch(NullPointerException e) {
        r.close();
        break;
    }
    //Do stuff with line
}

其他人说过的应该也能行。


这段代码是否会抛出“NullPointerException”?我认为你需要检查一下“if (s == null)”语句。 - Solomon Ucko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接