Java интерактивный ввод EOF

#java #input #eof

#java #ввод #eof

Вопрос:

Я пытаюсь реализовать пользовательский интерфейс ввода для настольной игры. Я пытаюсь получать пользовательский ввод по одному, а затем записывать его в файл (поскольку мне нужно сохранить список ходов, сделанных пользователем). То, что у меня есть до сих пор, работает хорошо (считывание входных данных и запись их в файл), однако, всякий раз, когда пользователь хочет прекратить ввод, программа просто перестает работать. Т.Е. Когда вы нажимаете ctrl c, программа просто завершается.

Вот что у меня есть на данный момент, переменная fileName была объявлена вне основной функции

 public static void main(String[] args) throws IOException {
    BufferedReader inputReader = new BufferedReader (new InputStreamReader (System.in));
    try {
        FileWriter outFile = new FileWriter (fileName);
        PrintWriter out = new PrintWriter (outFile);
        System.out.print ("Enter move: ");
        String line = inputReader.readLine();
        while (line != null) {
            System.out.print ("Enter move: ");
            out.write(inputReader.readLine());
            out.write(" ");
            }
            out.close();
    } catch (IOException e) {
        System.out.println (e.getMessage());
    }

    System.out.println ("Reached here");
}
  

Что я пытаюсь сделать, так это всякий раз, когда пользователь хочет прекратить ввод, я хочу перейти к строке печати, где написано «Достигнуто здесь». Я хочу сделать это, потому что, выйдя из цикла, я могу прочитать файл, а затем разделить входные данные и манипулировать ими. Я помню, что во время программирования на C раньше существовало while (input != EOF); где всякий раз, когда пользователь вводил ctrl d или ctrl c, он останавливает все, что делает, а затем переходит к следующей строке кода.
Как я могу это сделать на Java?

Большое спасибо.

Комментарии:

1. Control-C завершит работу вашего приложения

Ответ №1:

Если вы очищаете после каждой записи, вы должны, по крайней мере, получать полный файл, когда пользователь нажимает control-c.

Что касается обработки дополнительной информации после запуска control-c, вы можете сделать это с помощью перехвата завершения работы, такого как:

 Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { 
        // do something before quiting
    }
});
  

однако я не знаю, можете ли вы отменить завершение.

Я бы выбрал более обычный ввод символов для действия «больше не вводить».

Комментарии:

1. Спасибо, я попробую, просто ради опыта: D

Ответ №2:

Вы можете перехватить сигнал Ctrl C с помощью SignalHandler. Хотя я бы не рекомендовал это, поскольку это затруднило бы пользователю выход из вашего приложения. Вместо этого вы могли бы остановить ввод, когда пользователь ничего не вводит, или использовать другой командный сигнал.

Комментарии:

1. Спасибо, я изменил интерфейс на ввод команды для остановки ввода.

Ответ №3:

Вам нужно согласиться с командой, указывающей, что пользователь закончил (например, «EOF»), и добавить следующее в свой цикл while:

     while (line != null) {
        System.out.print ("Enter move: ");
        String r = inputReader.readLine();
        if ( r != null ) {
           if ( "EOF".equals(r) ) break;
        }
        out.write();
        out.write(" ");
    }