了解BufferedReader如何在Java中工作

时间:2015-03-08 17:33:53

标签: java bufferedreader filereader

关于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();
  }
 }
}

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

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

为什么我认为 工作

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

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

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

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

4 个答案:

答案 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))