使用 BufferedReaders 循环搜索字符串?

Loop a search for a string using BufferedReaders?

我正在使用两个 BufferedReader,一个用于读取文档,另一个用于获取要从用户搜索的字符串的输入,听从建议 here。到目前为止,这是代码:

import java.io.*;
import java.util.*;

public class Ejercicio6 {

    public static void main(String[] args) {

        Character answer = 'S'; 
        boolean exit = false;
        String name;
        String line;
        Scanner sc = new Scanner (System.in);
        boolean found = false;

        File file = new File ("/test/Ejercicio6/nombres.txt");

        try {

            do{

                exit = false;
                FileInputStream fis = new FileInputStream(file);
                BufferedReader readFile = new BufferedReader(new FileReader(file));
                BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Search a name, I'll tell you if it's found:");
                name = userInput.readLine();
                while ((line = readFile.readLine()) != null && found == false){
                    if(line.equals(name)) {
                        found = true;
                    }else
                        found = false;
                }

                if (found == true)
                    System.out.println("I have found the name " +name+ " in the file " +file.getName());
                if (found == false)
                        System.out.println("Can't find the name");
                fis.getChannel().position(0);
                fileRead = new BufferedReader(new InputStreamReader(fis));

                System.out.println("Do you want to try again? (Y/N)");
                answer = sc.nextLine().toUpperCase().charAt(0);
                if (answer =='S'){

                    exit = false;
                }else

                    exit = true;
                fileRead.close();
            }while (exit == false);

//      }catch (FileNotFoundException e) {
//          e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();

        }

    }

}

文档上有 3 个名字,但无论输入匹配与否,我总是得到 "name found" 打印。正如 here 所说,我正试图弄清楚 getChannel() 和缓冲区清除是如何进行的,但我遇到了很多麻烦。我错过了什么?

在打印匹配或不匹配的名称后,您需要再次将找到的标志取消设置为 false。 只需添加

found = false;

之前

fis.getChannel().position(0);

if (line.equals(name)) {
    found = true;
} else
    found = false;

可以简化:

found = line.equals(name);

只需将 boolean found = false; 移动到 while 循环之前

package com.company;

import java.io.*;
import java.util.Scanner;

public class Ejercicio6 {
    public static void main(String[] args) {
        Character answer;
        boolean exit;
        String name;
        String line;
        Scanner sc = new Scanner(System.in);
        File file = new File("file.txt");
        try {
            do {
                FileInputStream fis = new FileInputStream(file);
                BufferedReader readFile = new BufferedReader(new FileReader(file));
                BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Search a name, I'll tell you if it's found:");
                name = userInput.readLine();
                boolean found = false;
                while ((line = readFile.readLine()) != null && found == false) {
                    found = line.equals(name);
                }
                if (found == true)
                    System.out.println("I have found the name " + name + " in the file " + file.getName());
                if (found == false)
                    System.out.println("Can't find the name");
                fis.getChannel().position(0);
                BufferedReader fileRead = new BufferedReader(new InputStreamReader(fis));
                System.out.println("Do you want to try again? (Y/N)");
                answer = sc.nextLine().toUpperCase().charAt(0);
                exit = answer != 'S';
                fileRead.close();
            } while (exit == false);
//      }catch (FileNotFoundException e) {
//          e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}