Можно ли использовать файловый сканер несколько раз без объявления нескольких сканеров? - PullRequest
1 голос
/ 06 апреля 2019

Я создаю программу для своего импровизированного театра, которая поможет нам выбирать игры, в которые мы играем на концертах ночью, не перекрывая стили любых других игр. Я столкнулся с проблемой, хотя. В приведенном ниже коде Scanner scWU считывает файл .txt, содержащий названия улучшенных игр, а Scanner sc является обычным сканером System.in.

Я вставил два моих метода ниже. getWarmUp () возвращает строку (игру) после того, как она считается выполнимой игрой определенной категории (в данном случае, категории разминки). isWarmUp () считывает файл warmupgames.txt и проверяет, является ли введенная игра разминкой

Мой вопрос: если пользователь не может ввести название игры (и isWarmUp возвращает false), как я могу перезапустить метод ИЛИ сбросить сканер scWU в верхней части файла? Должен ли я объявить несколько сканеров? Или я мог бы легко заставить этот же сканер снова сканировать файл после того, как пользователь не сможет правильно войти в игру? (ПРИМЕЧАНИЕ: я знаю, что цикл while в строке 25 является бесконечным циклом. Здесь я надеюсь ответить на этот вопрос)

Я отвечу на все вопросы о моем коде

   public static String getWarmUp(Scanner sc, Scanner scWU)
   {
      String prompt = "What warm-up game will you choose? \n" +
                      "(NOTE: Type game as it's written on the board. Caps and symbols don't matter.)\n" +
                      "> ";

      System.out.print(prompt);
      String game = sc.nextLine();

      //This while loop is infinite. This is where I'm hoping to somehow allow the scanner to reset and
      //read again on a failed input
      while(!warmUp)
      {
         warmUp = isWarmUp(scWU, game);
         if(!warmUp)
            System.out.println("That's not a warm-up game, try again.");
      }

      return game;
   }

   public static boolean isWarmUp(Scanner scWU1, String game)
   {
      int lineNum = 0;

         while(scWU1.hasNextLine())
         {
            String line = scWU1.nextLine();
            lineNum++;
            if(line.equalsIgnoreCase(game))
               return true;
         }

      return false;

1 Ответ

1 голос
/ 06 апреля 2019

Вот что я имею в виду.Предположительно, вы сейчас используете getWarmUp что-то вроде этого:

String gamesFileName = "theGamesFile.txt");
Scanner in = new Scanner(System.in);
Scanner games = new Scanner(gamesFileName);
getWarmUp(in, games);

Но getWarmUp (или, скорее, isWarmUp, который вызывает getWarmUp), возможно, потребуется перечитать файл изначало.Единственный способ сделать это - создать новый Scanner.И вам понадобится имя файла, чтобы создать новый Scanner.Поэтому пусть getWarmUp примет имя файла в качестве аргумента вместо открытого Scanner:

public static String getWarmUp(Scanner sc, String gamesFn)
   {
      boolean warmUp = false;    
      while(!warmUp)
      {
          String prompt = "What warm-up game will you choose? \n" +
                          "(NOTE: Type game as it's written on the board. Caps and symbols don't matter.)\n" +
                      "> ";
          System.out.print(prompt);

          String game = sc.nextLine();

          Scanner scWU = new Scanner(gamesFn);
          warmUp = isWarmUp(scWU, game);
          scWU.close();
          if(!warmUp)
              System.out.println("That's not a warm-up game, try again.");
      }    
      return game;
   }    

Затем вызовите его так:

String gamesFileName = "theGamesFile.txt");
Scanner in = new Scanner(System.in);
getWarmUp(in, gamesFileName);
...