CodeGym/Java Blog/Willekeurig/Java-scannerklasse
John Squirrels
Niveau 41
San Francisco

Java-scannerklasse

Gepubliceerd in de groep Willekeurig
Hoi! Onze les vandaag zal speciaal zijn! In de les van vandaag zullen we het hebben over Java Scanner Class. Voorheen was het proces van het voltooien van taken en het schrijven van programma's eenvoudig: we schrijven wat code, voeren de main()methode, het programma doet wat nodig is, en we zijn klaar. Maar nu gaat alles veranderen! Vandaag leren we hoe we echt met het programma kunnen omgaan: we leren het hoe te reageren op onze acties! Voordat we beginnen met het analyseren van de code, heb je ooit te maken gehad met een apparaat zoals een scanner? Waarschijnlijk. De binnenkant van een scanner is behoorlijk ingewikkeld, maar het basisidee van hoe het werkt is heel simpel: het leest gegevens die de gebruiker verstrekt (zoals een paspoort of verzekeringspolis) en slaat deze informatie op in het geheugen (bijvoorbeeld als afbeelding ). Vandaag ga je je eigen scanner maken! Natuurlijk kan het geen papieren documenten aan, maar tekst zal er geen probleem voor zijn :) Aan de slag!

Java's Scanner-klasse

Scannerklasse - 1Eerst en vooral moeten we kennis maken met de klasse java.util.Scanner . De functionaliteit is heel eenvoudig. Net als een echte scanner leest het gegevens uit een bron die u opgeeft. Bijvoorbeeld een string, een bestand, de console. Vervolgens herkent het de informatie en verwerkt het op de juiste manier. Hier is het eenvoudigste voorbeeld:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
We hebben een scannerobject gemaakt en de gegevensbron gespecificeerd (een reeks tekst). De methode nextLine() benadert de gegevensbron (onze tekst met een kwatrijn), zoekt de volgende ongelezen regel (in dit geval de eerste regel) en retourneert deze. Vervolgens geven we het weer op de console: Console-uitvoer:
It matters not how strait the gate,
We kunnen de methode nextLine() meerdere keren gebruiken en het volledige gedichtfragment weergeven:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
Elke keer doet onze scanner een stap vooruit en leest de volgende regel. De uitvoer van het programma wordt weergegeven:
It matters not how strait the gate,
How charged with punishments the scroll,
I am the master of my fate,
I am the captain of my soul
Zoals we al hebben gezegd, hoeft de gegevensbron van de scanner geen tekenreeks te zijn. Het kan bijvoorbeeld de console zijn. Opwindend nieuws voor u: voorheen gaven we daar alleen gegevens weer, maar nu lezen we gegevens van het toetsenbord! Laten we eens kijken wat de klasse Scanner nog meer doet:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
De methode nextInt() leest en retourneert het ingevoerde getal. In ons programma gebruiken we het om een ​​waarde toe te wijzen aan de variabele nummer . Het lijkt al meer op een echte scanner! Het programma vraagt ​​de gebruiker om een ​​willekeurig nummer in te voeren. Nadat de gebruiker dit heeft gedaan, bedankt het programma de gebruiker, geeft het resultaat weer en is klaar. Maar we hebben nog steeds een serieus probleem. De gebruiker kan een fout maken en iets verkeerd invoeren. Hier is een voorbeeld waarbij ons huidige programma niet meer werkt:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
Laten we proberen de tekenreeks "CodeGym" in te voeren in plaats van een getal: Console-uitvoer:
Enter a number:
CodeGym
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Main.main(Main.java:10) Process finished with exit code 1
Oh Oh. We zitten in grote problemen -_- Om dergelijke situaties te voorkomen, moeten we een manier bedenken om de door de gebruiker ingevoerde gegevens te verifiëren. Als de gebruiker bijvoorbeeld iets anders invoert dan een nummer, zou het goed zijn om een ​​waarschuwing weer te geven dat de ingevoerde informatie geen nummer is. En als de informatie in orde is, kunnen we dit bevestigen. Maar hiervoor zouden we "in de toekomst moeten kijken" om te zien wat er in onze stroom komt. Kan Scanner dit doen? En hoe! En het heeft een hele reeks methoden om dit te doen: hasNextInt() — Deze methode controleert of het volgende stuk invoergegevens een getal is (retourneert waar of onwaar, naargelang het geval). hasNextLine() — Deze methode controleert of het volgende deel van de invoer een string is. heeftNextByte() ,hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — Al deze methoden voeren vergelijkbare controles uit voor de overige gegevenstypen. Laten we proberen ons nummerleesprogramma te veranderen:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thanks! You entered the number " + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
Ons programma controleert nu of het volgende ingevoerde teken een getal is. En het geeft alleen een bevestiging weer als dat zo is. Als de invoer niet door de controle komt, merkt het programma dit op en vraagt ​​het de gebruiker om het opnieuw te proberen. In principe kunt u communiceren met het Scanner- object en van tevoren ontdekken welk gegevenstype u te wachten staat. Een getal, string of iets anders? Een getal? En wat voor soort? Een int , short , long ?" Deze flexibiliteit geeft je de mogelijkheid om programmalogica te bouwen die afhangt van het gedrag van de gebruiker. We moeten een andere belangrijke methode noteren: useDelimiter() . Je geeft een string door aan deze methode. De string bevat de tekens die u wilt gebruiken als scheidingstekens of scheidingstekens. Stel dat we plotseling geïnteresseerd raakten in Japanse poëzie en besloten onze scanner te gebruiken om een ​​haiku te lezen die is geschreven door de grote dichter Matsuo Bashō. Zelfs als drie verschillende verzen als één onhandige reeks aan ons worden doorgegeven, kunnen we ze gemakkelijk splitsen en mooi weergeven:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a withered branch'" +
               "A crow has alighted.'" +
               "Nightfall in autumn." +
               "''***''" +
               "Such a moon above,'" +
               "Like a tree cut at the root:'" +
               "he fresh cut is white." +
               "''***''" +
               "How the river floods!'" +
               "A heron wanders on short legs,'" +
               "Knee-deep in the water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
We gebruiken "\ n /*/*/*" (nieuw regelteken en drie sterretjes) als scheidingsteken. Als gevolg hiervan hebben we prachtige console-uitvoer, net als in boeken:
On a withered branch
A crow has alighted.
Nightfall in autumn.

***

Such a moon above,
Like a tree cut at the root:
The fresh cut is white.

***

How the river floods!
A heron wanders on short legs,
Knee-deep in the water.
Dit voorbeeld heeft nog een methode waar we absoluut op moeten wijzen: close() . Zoals elk object dat met I/O-streams werkt, moet de scanner worden gesloten wanneer deze klaar is, zodat deze de bronnen van de computer niet meer verbruikt. Vergeet nooit de methode close() !
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

       sc.close(); // Now we've done everything right!

   }
}
Dat is het! Zoals u kunt zien, hoe nuttig het ook is, de klasse Scanner is vrij eenvoudig te gebruiken! :) Om te versterken wat je hebt geleerd, raden we je aan een videoles van onze Java-cursus te bekijken
Opmerkingen
  • Populair
  • Nieuw
  • Oud
Je moet ingelogd zijn om opmerkingen te kunnen maken
Deze pagina heeft nog geen opmerkingen