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

时间:2013-07-16 14:10:37

标签: java file-io bufferedreader readline

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

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时,它已经移动到下一行,那么我该如何再次检查呢?

我还没有想出办法 - 任何建议都会有很大的帮助。

7 个答案:

答案 0 :(得分:28)

Am ...你可以简单地使用这样的结构:

String line;

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

答案 1 :(得分:4)

您可以使用以下内容检查文件的结尾。

public bool isEOF(BufferedReader br)  
{
     boolean result;

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

答案 2 :(得分:3)

如果你想循环遍历所有行,请使用:

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

首先是一个问题,为什么不使用“ 功能编程方法”?无论如何,自 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);
    }

}

答案 5 :(得分:0)

您可以通过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快。

答案 6 :(得分:-2)

你可能故意让它在你的循环中抛出错误。即:

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

其他人都伤心的事也应该有效。