了解BufferedReader在Java中的工作原理

了解BufferedReader在Java中的工作原理,java,bufferedreader,filereader,Java,Bufferedreader,Filereader,关于BufferedReader如何工作的非常基本的问题。给定字符串/短语,我想从包含大量文本的文件中查找并打印它 我在这个问题上做了一些研究,这是最接近的结果。但我没有完全解决我的问题 有了这些信息,为什么下面的代码会终止 public class MainApp { String line = null; String phrase = "eye"; try { File file = new File("text.txt"); FileReader fr = new F

关于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)(短语)的条件
  • 找到了这个短语
为什么我认为它可能不起作用:


  • 读线在BufferedReader中不作为字符串存储(因此无法比较)

  • 错误逻辑(最有可能是if语句)

为了简单起见,假设<强>“Tr.txt”填充了非常长的IpSUM乱数假文,并用一个强< >眼睛> <强>字放在中间。 问题到底出在哪里?(如果可能,请不要提供完整的代码解决方案,为了练习起见,我希望自己编写代码部分)。

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

if (line.contains(phrase)) { 
所以这就是你所说的“错误的逻辑(很可能是if语句)”

然后,您可以打印该行(或您想做的任何事情)

如果该行为以下内容:

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

虽然它包含您想要捕获的眼睛,但它将不匹配。因此,如我所述,更改if,您就可以开始了。您的代码应该可以工作。
BufferedReader类只从流中读取数据缓冲区。
只是意味着它不会从文件中逐字节读取数据(这将需要很长时间才能执行)

BufferedReader类
将从文件中读取一个字节缓冲区(例如1024字节)。它将查找行分隔符(“\n”)在缓冲区中。如果找不到,字节将追加到
StringBuilder
对象中,并提取下一个缓冲区。这将发生在缓冲区中找到行分隔符之前。缓冲区中直到行分隔符为止的所有字节将追加到
StringBuilder
对象中,最后字符串将返回到
StringBuilder
对象中哦,你


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

当你阅读一行时,它也会包含该行中的所有其他数据

some words eye some other words
要正确查找该行是否包含“eye”,应调用
contains()
而不是
equals()


您对该块如何工作的理解:

  • while循环遍历每行文本,直到条件不再为真
正确:-)

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

  • 循环一直工作,直到满足if(line.equals)(短语)的条件
不正确。即使满足条件,循环仍将继续工作。如果要停止循环,则需要插入
break
语句。在您的情况下,当满足条件时,它将打印整行,循环将继续。在您的情况下,该语句可能永远不会满足,因为
if(line.equals(短语)
可能永远不会是真的

  • 找到了这个短语
可能,如果整行等于短语。如果短语被其他单词包围,则条件
(line.equals(短语)
将不为真

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


  • 读线在BufferedReader中不作为字符串存储(因此无法比较)
如前所述,
BufferedReader
中没有存储任何内容。您将每一行存储在
line
变量中。然后您将与
line
变量进行比较

  • 错误逻辑(最有可能是if语句)
是的。
if
语句中的条件是错误的,因为它检查整行是否与所需短语匹配。此外,即使找到短语,循环也将继续运行

为了简单起见,假设<强>“Tr.txt”填充了非常长的IpSUM乱数假文,并用一个强< >眼睛> <强>字放在中间。 在这种情况下,您的代码可能不会打印任何内容

问题到底出在哪里?(如果可能的话,不要提供完整的代码解决方案,为了练习,我愿意自己做代码部分)

问题出在循环的条件下。请将鼠标悬停在此处以查看应如何处理:

if(line.contains(短语))


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

是什么让您认为读取行不是
String
s?“读取行不会作为字符串存储在BufferedReader中”。具体是什么
some words eye some other words
if (line.contains(phrase))