.contains无法与BufferedReader一起使用

问题描述

我正在尝试创建一个程序来检查文件,如果它们包含单词“ TRUE”,则将行打印回给我。

这是文件内容

TRUE,TRUE
FALSE,FALSE
TRUE,TRUE
TRUE,FALSE

这是程序

public static void main(String[] args) {
    // Todo Auto-generated method stub
    
    BufferedReader reader;
    try {
        reader = new BufferedReader(new FileReader(
                "C:\\Users\\tree3\\Desktop\\Programming\\file.txt"));
        String line = reader.readLine();
        while (line != null) {
            
            if(line.contains("TRUE")) { 
                System.out.println(line);
                // read next line
                line = reader.readLine();
            } else {
                System.out.println("false");
            }
            
            
        }
        reader.close();
    } catch (IOException e) {
        e.printstacktrace();
    }
    
}

程序只是无限期地打印false

这是为什么?

解决方法

public static void main(String[] args) {
    try (BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\tree3\\Desktop\\Programming\\file.txt"))) {
        String line = reader.readLine();
        while (line != null) {
            if (line.contains("TRUE")) {
                System.out.println(line);
            } else {
                System.out.println("false");
            }
            // read next line
            line = reader.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

请勿在if语句中读取下一行。如果if语句不正确怎么办?您将永远不会无限期地停留在那条线上。

使用try-with-resources(Java 7+),不必担心关闭资源。


清洁器(Java 8 +):

try (BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\tree3\\Desktop\\Programming\\file.txt"))) {
    reader.lines().forEach(line -> System.out.println(line.contains("TRUE")));
} catch (IOException e) {
    e.printStackTrace();
}