Как использовать несколько объектов Scanner на System.in? - PullRequest
7 голосов
/ 20 ноября 2010

Как правильно использовать несколько объектов Scanner в моей программе.Например, я использую сканер для чтения файла, затем, в зависимости от того, что найдено в файле, я снова использую сканер, чтобы запросить ввод данных пользователем.Выдержка из моего кода показана

....
Scanner f = new Scanner (System.in); //get the file name
String fileName = f.next();
Scanner input = new Scanner( new File( fileName ) );
while ( input.hasNext() )
{
   String currentLine = input.nextLine();
   if ( some pattern found) {
       Scanner getUserInput = new Scanner (System.in);
       String userInput = getUserInput.next();
       .....
   }
}
....

Это не похоже на работу.Нужно ли использовать userInput.close()?Что я делаю неправильно.?

Что я не понимаю, так это то, что первый System.in просто получает имя файла.После этого почему мешает второй System.in.Что касается объекта input, его чтение из файла, а не из System.in.

1 Ответ

11 голосов
/ 20 ноября 2010

Что я делаю не так?

Использование нескольких сканеров в одном потоке является основной проблемой.Сканеры могут (и будут) потреблять поток - это может (будет) приводить к неожиданным побочным эффектам.Лучше всего этого не делать.

Если вход закрыт, то вход (но в строках нет метода close) закрыт для всех - и это не очень интересно для всех.

Редактировать: «Подробности» о том, почему несколько сканеров плохи: Не создавать несколько буферных упаковщиков на InputStream

... любая буферная оболочка небезопасна;это условие также можно использовать, если вместо него используется сканер ...

См. также Вопрос о коде Java ... связанный со сканером? , в котором также говорится о некоторых подходах.

...