了解BufferedReader在Java中的工作原理
关于BufferedReader如何工作的非常基本的问题。给定字符串/短语,我想从包含大量文本的文件中查找并打印它 我在这个问题上做了一些研究,这是最接近的结果。但我没有完全解决我的问题 有了这些信息,为什么下面的代码会终止了解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
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))