2016-10-13 4 views
1

Kann ich den Scanner verwenden, um vom Benutzer zu lesen, um eine bestimmte Eingabe einzugeben, und dann eine neue Instanz davon zu erstellen, um zum Beispiel aus einer Datei zu lesen?Verwendung des gleichen Scanners in 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

Ja , Sie können. Warum hast du es nicht versucht? – xenteros

+0

einfach 'if' verwenden, wenn Übereinstimmung gefunden wird, Scanner neu initialisieren –

+0

@PavneetSingh er hat einen Arbeitscode. Falls Dateiname der Pfad zu der Datei mit der Erweiterung ist, wird es funktionieren – xenteros

Antwort

2

Nun, müssen Sie ein File verwenden:

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

Es wäre sicherer, try-catch nicht vorhandene Datei. Sie können if-else verwenden. Nun ... Logik liegt an dir. Vielleicht so etwas wie folgt aus:

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

Natürlich können Sie die if Zustand ändern, was auch immer Sie mögen. Ich wollte dir nur eine breitere Perspektive geben. Sie können auf equals wechseln, wenn Sie möchten.

+0

scheint wie du habe meinen Kommentar auch nicht gelesen, OP will das nicht, füge einfach eine 'if'-Bedingung hinzu, um die OP-Anforderungen zu erfüllen –

+1

@PavneetSingh ja, hinzugefügt. Miss trat in die Beta-Version der Antwort ein. Sorry m8 – xenteros

+0

Ich würde einfach einen 'Scanner tmp = sc;' vor der Schleife hinzufügen, um den Scanner aus System.in zu schließen, wenn die Datei existiert. Wenn nicht, bleibt diese Instanz geöffnet – AxelH

-1

Sie verwenden nicht dieselbe Scanner wie in Ihrem Fragetitel angegeben. Sie erstellen zwei verschiedene und unabhängige Instanzen von Scanner.

sc in Ihrem Code ist eine Scanner-Referenz. Zunächst verweist es auf das erste Objekt Scanner. Dann ändern Sie die Objektreferenz so, dass sie auf das zweite Objekt Scanner zeigt. Sie verwenden die Scanner Objekte nicht erneut, Sie verwenden die Objektreferenz erneut. Das ist vollkommen in Ordnung.

Wenn ein Objekt Scanner erstellt wird, kann die vom Scanner verwendete Quelle nicht geändert werden. Wenn Daten aus einer anderen Quelle abgerufen werden sollen, muss eine neue Instanz erstellt werden.

In Ihrem Codebeispiel ist Ihr Ansatz, zwei verschiedene Scanner für System.in und eine Datei zu verwenden, gut. Das Problem in Ihrem Beispiel ist jedoch, dass Sie den falschen Konstruktor für die Datei Scanner verwenden. Um einen Scanner mit der Datei als Quelle zu erstellen, benötigen Sie einen File oder Path Objekt zu erstellen und dieses Objekt als Konstruktor-Parameter verwenden anstelle des Dateinamens String:

new Scanner(new File(filename)); 

Oder:

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

Sie haben Recht über instances, aber gibt es eine andere Lösung? Kannst du den Strom der bestehenden Innance ändern? Dies sollte in Ihrer Antwort beantwortet werden;) – AxelH

Verwandte Themen