了解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()
就是你要走的路。