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

Posted

技术标签:

【中文标题】使用 BufferedReader 读取行并检查文件结尾【英文标题】:Reading lines with BufferedReader and checking for end of file 【发布时间】:2013-07-14 18:30:04 【问题描述】:

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

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

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

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

【问题讨论】:

真的希望人们在投票时留下一个理由。否决票应该表明问题有问题,所以也许可以重新格式化。在不说明为什么投反对票的情况下反对投票对任何人都没有帮助 【参考方案1】:

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

String line;

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

【讨论】:

你先回答,我会删除我的:)【参考方案2】:

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

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

br.close();

【讨论】:

【参考方案3】:

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

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

其他人的悲伤也应该起作用。

【讨论】:

这真的会抛出NullPointerException吗?我认为您需要检查if (s == null)【参考方案4】:

您可以使用以下方法检查文件结尾。

public bool isEOF(BufferedReader br)  

     boolean result;

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

【讨论】:

在我看来,这比在 while 子句中分配 + 比较要好。 这会在异常情况下静默失败,即使下一次读取成功,BufferedReader::ready 也会返回 false。【参考方案5】:

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

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

【讨论】:

将赋值放在 while 子句之外,这样会更简洁。【参考方案6】:

首先问一个问题,为什么不使用“函数式编程方法”?无论如何,从 Java 1.8 开始添加了一个新方法 lines(),它让 BufferedReaderStream 的形式返回内容.它将文件中的所有行作为流获取,然后您可以根据逻辑对字符串进行排序,然后将其收集到列表/集中并写入输出文件。如果您使用相同的方法,则无需担心 NullPointerException。下面是相同的代码sn-p:-

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()【参考方案7】:

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

【讨论】:

以上是关于使用 BufferedReader 读取行并检查文件结尾的主要内容,如果未能解决你的问题,请参考以下文章

如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?

如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?

使用 VB 应用程序从记事本中读取行并提交信息

从 InputStream 读取时,Android Socket BufferedReader readLine() 不起作用

Java 中 BufferedReader.readLine() 的最大行长?

我可以偷看 BufferedReader 吗?