#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(" ");
}