关于BufferedReader如何工作的非常基本的问题。给定字符串/短语,我想从文件中找到并打印出大量文本。
using BufferedReader in Java我对这个主题进行了一些研究,这是最接近的结果。但是并没有完全解决我的问题。
因此,有了这些信息,为什么以下代码会终止?
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();
}
}
}
我对该块应该如何工作的理解:
为什么我认为 不 工作
readlines未作为字符串存储在 BufferedReader 中(因此无法进行比较)
错误的逻辑(很可能是if语句)
为了简单起见,我们假设“text.txt”填充了很长的传说ipsum,其中一个“eye”字放在中间位置它的。
问题究竟在哪里? (如果可能的话,不要提供完整的代码解决方案,我很乐意为了练习而自己编写代码部分。)
答案 0 :(得分:3)
您的代码应该有效。 BufferedReader Class
只读取流中数据的缓冲区。它只是意味着它不会从文件中逐字节地读取(这将需要永久执行)。
BufferedReader Class
将做的是从文件中读取一个字节缓冲区(例如1024字节)。它将在缓冲区中查找行分隔符(" \ n")。如果未找到,则字节将附加在StringBuilder
对象中,并且将获取下一个缓冲区。这将发生在缓冲区中找到行分隔符之前。直到行分隔符的缓冲区中的所有字节都将附加到StringBuilder
对象,最后字符串将返回给您。
编辑:根据实现,行分隔符可能包含也可能不包含在字符串中。其他人指出contains()
,然而,它会慢得多。如果要查找特定行,请使用equals()
(在短语String中添加行分隔符)。如果您想在一行中找到特定的短语,那么contains()
就是您的选择。
答案 1 :(得分:2)
您需要使用 line.contains 方法,而不是您当前使用的 line.equals
if (line.contains(phrase)) {
所以你正在说“错误的逻辑(很可能是if语句)”
然后你可以打印这行(或你想做的任何事情)
System.out.println(s);
如果该行如下:
Lorem ipsum dolor sit amet, **eye** consectetur adipiscing elit.
它不会匹配,虽然它包含你要捕捉的 eye ..所以改变我提到的if你很高兴去
答案 2 :(得分:2)
您对此块应如何运作的理解:
- while循环遍历每行文本,直到条件不再为真
正确:-)。
- 每一行都存储在 BufferedReader
中
不正确。 bufferedReader
不存储任何数据,它只是读取它(这就是为什么它被称为bufferedReader
)。当你调用br.readLine()
时,它会给你一个包含该行内容的字符串,但它不会存储任何东西。在您的情况下,每一行都存储在line
变量中,每次循环运行时都会被覆盖。
- 循环正常工作,直到符合 if(line.equals(phrase)。
不正确。即使满足条件,循环也将继续工作。如果要停止循环,则需要插入break
语句。在您的情况下,当满足条件 时,它将打印整行,并且循环将继续。在你的情况下,语句可能永远不会被满足,因为if (line.equals(phrase)
可能永远不会成为现实。
- 打印发现的短语。
可能,如果整个行等于短语。如果短语被其他单词包围,则条件(line.equals(phrase)
将不成立。
为什么你认为 不 工作
- readlines未作为字符串存储在 BufferedReader 中(因此无法进行比较)
如上所述,BufferedReader
内没有任何内容。您将每个单独的行存储在line
变量中。然后,您将与line
变量进行比较。
- 错误的逻辑(很可能是if语句)
是。 if
语句中的条件是错误的,因为它检查整个行是否与所需短语匹配。此外,即使找到短语,循环也将继续运行。
为了简单起见,我们假设“text.txt”填充了很长的传说ipsum,其中一个“eye”字放在中间位置它的。
在这种情况下,您的代码可能不会打印任何内容。
问题究竟在哪里? (如果可能的话,不要提供完整的代码解决方案,我很乐意为了练习而自己编写代码部分)
问题在于循环的条件。徘徊在这里,看看它应该如何:
if (line.contains(phrase))
此外,循环中没有break
语句,因此如果文件中存在短语,它将多次打印该短语。 (如果循环的条件是固定的!)
答案 3 :(得分:1)
当您读取一行时,它还将包含该行
上的所有其他数据some words eye some other words
要正确查找该行是否包含' eye'您应该拨打contains()
而不是equals()
if (line.contains(phrase))