了解BufferedReader如何在Java中工作

关于BufferedReader如何工作的非常基本的问题。 给定字符串/短语,我想从文件中找到并打印它,其中包含大量文本。

在Java中使用BufferedReader我对这个主题进行了一些研究,这是最接近的结果。 虽然没有解决我的问题。

因此,有了这些信息,为什么以下代码终止?

public class MainApp { String line = null; String phrase = "eye"; try { File file = new File("text.txt"); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); while((line = br.readLine()) != null) { if (line.equals(phrase) { System.out.println(line); } } br.close(); } catch (Exception e) { e.printStackTrace(); } } } 

我对这个块应该如何工作的理解:

  • while循环遍历每行文本,直到条件不再为真
  • 每行都存储在BufferedReader中
  • 循环正在工作,直到满足if(line.equals(短语))的条件。
  • 打印发现的短语。

为什么我认为它可能 不起作用:

  • readlines不会作为字符串存储在BufferedReader中 (因此无法进行比较)

  • 错误的逻辑(很可能是if语句)

为了简单起见,我们假设“text.txt”填充了非常长的传说ipsum,其中一个“眼”字放在它的中间位置。

问题究竟在哪里? (如果可能的话,不要提供完整的代码解决方案,我很乐意为了练习而自己编写代码部分)

您了解此块应如何工作:

  • while循环遍历每行文本,直到条件不再为真

正确:-)。

  • 每行都存储在BufferedReader中

不正确。 bufferedReader不存储任何数据,它只是读取它(这就是为什么它被称为bufferedReader )。 当你调用br.readLine()它会给你一个包含该行内容的String,但它本身不会存储任何内容。 在您的情况下,每一行都存储line变量中,每次循环运行时都会被覆盖。

  • 循环正在工作,直到满足if(line.equals(短语))的条件。

不正确。 即使满足条件,循环也将继续工作。 如果要停止循环,则需要插入break语句。 在您的情况下,当满足条件时,它将打印整行,循环将继续。 在你的情况下,语句可能永远不会被满足,因为if (line.equals(phrase)可能永远不会成立。

  • 打印发现的短语。

可能,如果行等于短语。 如果短语被其他单词包围,则条件(line.equals(phrase)将不为真。

为什么你认为它可能 不起作用:

  • readlines不会作为字符串存储在BufferedReader中 (因此无法进行比较)

如上所述, BufferedReader没有任何内容。 您将每个单独的行存储line变量中。 然后你要与line变量进行比较。

  • 错误的逻辑(很可能是if语句)

是。 if语句中的条件是错误的,因为它检查行是否与想要的短语匹配。 此外,即使找到短语,循环也将继续运行。

为了简单起见,我们假设“text.txt”填充了非常长的传说ipsum,其中一个“眼”字放在它的中间位置。

在这种情况下,您的代码可能不会打印任何内容。

问题究竟在哪里? (如果可能的话,不要提供完整的代码解决方案,我很乐意为了练习而自己编写代码部分)

问题在于循环的条件。 徘徊在这里看它应该是怎样的:

if (line.contains(phrase))

此外,循环中没有break语句,因此如果它存在于文件中,它将多次打印该短语。 (如果循环的条件是固定的!)

你需要使用line.contains方法,而不是你当前使用的line.equals

 if (line.contains(phrase)) { 

所以你说的是“错误的逻辑(很可能是if语句)”

然后你可以打印线(或任何你想做的)

 System.out.println(s); 

如果该行如下:

 Lorem ipsum dolor sit amet, **eye** consectetur adipiscing elit. 

它不会匹配,虽然它包含你想捕捉的眼睛 ..所以改变我提到的if,你很高兴去

当您读取一行时,它还将包含该行上的所有其他数据

 some words eye some other words 

要正确查找该行是否包含’eye’,您应该调用contains()而不是equals()

 if (line.contains(phrase)) 

你的代码应该有效。 BufferedReader Class只读取流中的数据缓冲区。 它只是意味着它不会从文件中逐字节读取(这将需要永久执行)。

BufferedReader Class将执行的操作是从文件中读取一个字节缓冲区(例如1024字节)。 它将在缓冲区中查找行分隔符(“\ n”)。 如果未找到,则字节将附加在StringBuilder对象中,并且将获取下一个缓冲区。 这将发生在缓冲区中找到行分隔符之前。 缓冲区中的所有字节直到行分隔符将附加到StringBuilder对象,最后字符串将返回给您。

编辑:根据实现,行分隔符可能包含也可能不包含在字符串中。 其他人指出contains() ,然而,它会慢得多。 如果要查找特定行,请使用equals() (在短语String中添加行分隔符)。 如果你想在一行中找到一个特定的短语,那么contains()就是你要走的路。