扫描程序仅搜索.txt文件的第一行

时间:2015-11-07 17:04:25

标签: java java.util.scanner bufferedreader

我正处于初级编程课程中,似乎在搜索文本文件时遇到了一个重大问题。根据作业,我的代码应该做什么:

  • 接受输入,在这种情况下是输入.txt文件的名称和位置
  • 允许用户搜索名称或名称的一部分,并返回所有匹配文本的行。

我完成了分配的输入部分,并且即将完成检索部分,但我的代码只搜索.txt文件的第一行。我能够打印出.txt文件的所有行,如果我在.txt文件的第1行中搜索名称,它将正确打印该行。当我在搜索不在第1行的名称时,我的问题出现了。下面是我的代码:

System.out.println ("Would you like to retrieve names from your index? (YES/NO)");
try
{
    retrieve=input.readLine();
   }
   catch (IOException E)
   {
    System.out.println(E);
   }
  }
 if (choice == 2 && retrieve.equalsIgnoreCase("YES") || retrieve.equalsIgnoreCase("Y"))
  {
   while (retrieve2.equalsIgnoreCase("YES") || retrieve2.equalsIgnoreCase("Y"))
   {
     FileReader reader = new FileReader("Name_Index.txt");
     BufferedReader bufferedReader = new BufferedReader(reader);
     String line = bufferedReader.readLine();

     System.out.println ("Enter a string of characters in which to search by or enter \"all names\" f$
     search_term = gatherInput();

     System.out.println("Search results include: ");
     ArrayList<String> list = new ArrayList<String>();
     Scanner inFile = new Scanner (new File("Name_Index.txt"));
     inFile.useDelimiter(",");

     while (inFile.hasNextLine())
     {
      list.add(inFile.nextLine());
     }
     Collections.sort(list);    
     if (search_term.equalsIgnoreCase("all names"))
     {
      for (String temp : list)
      {
       System.out.println(temp);
      }
     }
     else if (line.toLowerCase().contains(search_term.toLowerCase()))
     {
       System.out.println(line);     
       bufferedReader.close();
     }
System.out.println("End!");
    System.out.println ("Would you like to retrieve names from your index? (YES/NO)");
    try
    { 
     retrieve2=input.readLine();
    }
    catch (IOException E)
    {
     System.out.println(E);
    }
   }   
    System.out.println("Thank you, come again!");
  }
 }    
   public static String gatherInput()
   {
    Scanner scan = new Scanner(System.in);
    String user_input = scan.nextLine();
    return user_input;
   }
  }

我尝试扩展 while(inFile.hasNextLine())循环以包含第二个“if”语句,但这会为“所有名称”搜索创建一个问题 - 它会返回整个列表多次(但文件中有很多行)。我甚至尝试在第二个“if”语句中创建另一个 while(inFile.hasNextLine())循环,结果没有区别。

我在这一点上非常沮丧,因为我已经在这个代码上工作了一个多星期,并且在没有任何帮助的情况下审查了我的所有笔记和演讲录音。任何见解都会非常感激。

2 个答案:

答案 0 :(得分:1)

您只阅读文件的一行

List<String> lines = new ArrayList<>();
String line = bufferedReader.readLine();
while(line != null){
   lines.add(line);
   line = bufferedReader.readLine();
}
bufferedReader.close();

为什么不读取所有行并将它们存储在List中;

lines.stream().filter(l -> l.toLowerCase().contains(search_term.toLowerCase))
.forEach(s -> System.out.println(s));

然后打印包含子串ignorecase的所有行:

Do While CONDITION
      Dim a as string
Wend 

答案 1 :(得分:0)

您需要循环readLine()

例如:

  File f = new File(ruta);
            if(!f.exists()) //Error
            else {
                @SuppressWarnings("resource")
                BufferedReader br = new BufferedReader(new FileReader(f));
                String line;
                while ((line = br.readLine()) != null) {
                       //line = the next line
}
}