15

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

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

如果下一行是文件末尾,如何避免崩溃?(即空)

我需要阅读下一行,因为那里可能有一些我需要处理的东西,但如果没有,代码就会崩溃。

如果那里有东西,那么一切都很好,但我不能保证那里会有东西。

因此,如果我执行以下操作:(伪代码):

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

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

我遇到的问题是,当我检查该行是否为空时,它已经移动到下一行,那么我该如何再次检查呢?

我还没有想出办法来做到这一点 - 任何建议都会有很大帮助。

4

7 回答 7

43

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

String line;

while ((line = r.readLine()) != null) {
   // do your stuff...
}
于 2013-07-16T14:14:07.807 回答
7

如果您想遍历所有行,请使用:

while((line=br.readLine())!=null){
    System.out.println(line);
}
br.close();
于 2013-07-16T14:15:49.163 回答
5

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

public bool isEOF(BufferedReader br)  
{
     boolean result;

     try 
     {
         result = br.ready();
     } 
     catch (IOException e)
     {
         System.err.println(e);
     }
     return result;
}
于 2017-06-23T20:46:36.357 回答
2

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

String line = r.readLine();
while(line!=null){
   System.out.println(line);
   line = r.readLine();
}
于 2018-06-21T11:07:39.407 回答
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);
    }

}
于 2018-07-23T07:48:32.873 回答
0

您可以通过BufferReader. 我知道这与以下问题无关。但是我会为一个不会使用BufferReaderScanner用于阅读文件的新手发布额外的事实。

您可以使用BufferReaderJavaScanner类来读取文件并检查最后一行。

缓冲区阅读器

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.

此外,BufferReader比 快Scanner

于 2020-02-10T06:21:26.427 回答
-4

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

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

其他人所难过的也应该起作用。

于 2013-07-16T14:20:09.333 回答