2016-10-13 11 views
1

Могу ли я использовать сканер для чтения от пользователя для ввода определенного ввода, а затем создать новый экземпляр для чтения из файла, например?Использование одного и того же сканера в java

Scanner sc = new Scanner(System.in); 
System.out.print("Enter the file name: "); 
String fileName = sc.next(); 
sc = new Scanner(fileName); 

displayAll(sc); //a static void method that takes the Scanner object as a parameter and is supposed to read and display the input stored in the .txt file 
+2

Да , ты можешь. Почему ты не попробовал? – xenteros

+0

просто используйте 'if', когда совпадение найдено, повторите инициализацию сканера –

+0

@PavneetSingh у него есть рабочий код. В случае, если имя файла - это путь к файлу с расширением, он будет работать – xenteros

ответ

2

Ну, вам нужно использовать File:

Scanner sc = new Scanner(System.in); 
System.out.print("Enter the file name: "); 
String fileName = sc.next(); 
sc = new Scanner(new File(fileName)); 

Было бы безопаснее try-catch не существующего файла. Вы можете использовать if-else. Ну ... логика зависит от вас. Может быть, что-то вроде этого:

Scanner sc = new Scanner(System.in); 
while (true) { 
    System.out.println("Enter file name"); 
    String filename = sc.next(); 
    if (!filename.startsWith("sth")) { //this will reask if the file name doesn't start with "sth" 
     continue; 
    try { 
     Scanner s = sc; //just in case you never gonna use System.in 
     sc = new Scanner(new File(filename)); 
     s.close(); //just in case you're sure you never gonna use System.in 
     break; 
    } catch (Exception e) { 
     System.out.println("Wrong filename - try again"); 
    } 
} 

Очевидно, что вы можете изменить if условие, что вам нравится. Я просто хотел дать вам более широкую перспективу. Вы можете переключиться на equals, если хотите.

+0

похоже на вас тоже не читал мой комментарий, OP не хочет этого, просто добавьте условие 'if' для соответствия требованиям OP –

+1

@PavneetSingh yea, добавлено. Мисс ввела бета-версию ответа. Извините m8 – xenteros

+0

Я бы просто добавил «Сканер tmp = sc;» перед циклом, чтобы закрыть Scanner off System.in, если файл существует. Если нет, этот экземпляр останется открытым – AxelH

-1

Вы не используете (и ID): Scanner, как указано в заголовке вашего вопроса. Вы создаете два разных и независимых экземпляра Scanner.

sc в вашем коде является ссылкой на сканер. Сначала он ссылается на первый объект Scanner. Затем вы меняете ссылку на объект, чтобы указать на второй объект Scanner. Вы не используете повторно объекты Scanner, вы повторно используете ссылку на объект. Это нормально.

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

В вашем примере кода ваш подход к использованию двух разных сканеров для System.in и файла хорош. Однако проблема в вашем примере заключается в том, что вы используете неправильный конструктор для файла Scanner. Для создания сканера, используя файл в качестве источника, необходимо создать File или Path объект и использовать этот объект в качестве параметра конструктора вместо имени файла строки:

new Scanner(new File(filename)); 

Или:

new Scanner(Paths.get(filename)); 
+1

Вы верны о instanceS, но есть ли другое решение? Можете ли вы изменить поток существующего намерения? На это следует ответить в вашем ответе;) – AxelH

 Смежные вопросы

  • Нет связанных вопросов^_^