使用 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(),它让 BufferedReader 以 Stream 的形式返回内容.它将文件中的所有行作为流获取,然后您可以根据逻辑对字符串进行排序,然后将其收集到列表/集中并写入输出文件。如果您使用相同的方法,则无需担心 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
。
另外,BufferReader
比 Scanner
快。
【讨论】:
以上是关于使用 BufferedReader 读取行并检查文件结尾的主要内容,如果未能解决你的问题,请参考以下文章
如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?
如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?
从 InputStream 读取时,Android Socket BufferedReader readLine() 不起作用