1. Lezen vanaf de console met behulp vanSystem.in

In de vorige lessen hebben we kennis gemaakt met de commando's voor het weergeven van informatie op het scherm. Om dit te doen, hebben we het System.outobject en zijn print()en println()methoden gebruikt. Het is eenvoudig en handig.

Maar zoals je waarschijnlijk al geraden hebt, is het voor ons niet genoeg om informatie op het scherm weer te geven. Het doel van de meeste programma's is om iets nuttigs te doen voor de gebruiker. Dat betekent dat het heel vaak nodig is dat de gebruiker gegevens via het toetsenbord kan invoeren.

Net als bij uitvoer hebben we ook een speciaal object voor gegevensinvoer — System.in. Maar helaas voor ons is het niet zo handig als we zouden willen. Hiermee kunnen we gegevens van het toetsenbord teken voor teken lezen .

Om dit te verbeteren, zullen we een andere klasse gebruiken die, in combinatie met het System.inobject, ons alles zal geven wat we nodig hebben. Java biedt al geruime tijd lessen voor elke gelegenheid. En een van hen zullen we nu leren kennen.


2. Scannerklasse

De Scannerklasse (volledige naam: java.util.Scanner) kan gegevens uit verschillende bronnen lezen, bijvoorbeeld de console, bestanden en internet. Als we willen dat het gegevens van het toetsenbord leest, moeten we het System.inobject doorgeven als een argument dat als gegevensbron zal dienen. En dan zal het Scanner-object uitzoeken wat het ermee moet doen.

Lezen vanaf het toetsenbord met behulp van een Scannerobject ziet er ongeveer zo uit:

Code Uitleg
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
We maken een Scannervoorwerp.
We lezen een regel tekst van het toetsenbord.
We lezen een cijfer van het toetsenbord.

Het lijkt eenvoudig, maar is het ook zo eenvoudig?

Ik denk dat je een heleboel vragen hebt, en nu zullen we ze beantwoorden.

Maar laten we eerst een voorbeeld demonstreren van een compleet programma dat de Scannerklasse gebruikt:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      String name = console.nextLine();
      int age = console.nextInt();

      System.out.println("Name: " + name);
      System.out.println("Age: " + age);
   }
}

3. Een Scannerobject maken

De eerste vraag is wat is deze regel Scanner console = new Scanner (System.in);?

Deze regel kan verwarrend zijn, maar u zult de hele tijd soortgelijke dingen zien. We vinden het dus belangrijk om uit te leggen wat hier aan de hand is.

Bedenk hoe we gewoonlijk een variabele met tekst maken:

String str = "text";
Een tekenreeksvariabele declareren en initialiseren

Eerst schrijven we het type van de variabele ( String), dan de naam ( str), en ten slotte, na het gelijkteken, schrijven we de waarde.

Onze verbijsterende lijn is eigenlijk hetzelfde:

Scanner console = new Scanner(System.in);
ScannerEen variabele declareren en initialiseren

Alles links van het gelijkteken is de declaratie van een variabele met de naam consolewaarvan het type is Scanner. s Je zou het in plaats daarvan of scannerof zelfs kunnen noemen keyboard. Dan zou de code er zo uitzien:

Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();

Ik denk dat dat alles een stuk overzichtelijker maakt.

Maar de code rechts van het gelijkteken is iets gecompliceerder. Ik verwijs nu naar new Scanner(System.in); Dat gezegd hebbende, er gebeurt hier ook niets bovennatuurlijks.

In deze code vertellen we de Java-machine: maak een nieuw object (het newtrefwoord) waarvan het type is Scanner , en geef het System.inobject door als de gegevensbron voor het nieuw gemaakte Scannerobject.

Nadat we deze hele regel hebben uitgevoerd, hebben we een Scannervariabele met de naam console die ons programma zal gebruiken om gegevens van het toetsenbord te lezen.


4. Lijst met methoden

In het bovenstaande voorbeeld Scanner consoleslaat onze variabele een verwijzing naar een Scannerobject op.

Om methoden aan te roepen op een object waarnaar wordt verwezen door een variabele, schrijft u een punt achter de naam van de variabele, gevolgd door de naam van de methode en eventuele argumenten. Het algemene uiterlijk van de opdracht is als volgt:

variable.method(arguments);
Een methode aanroepen op een object waarnaar wordt verwezen door een variabele

Voorbeelden:

System.out.println("Hello");
System.out.println(1);

Als u niet van plan bent om argumenten aan een functie door te geven, schrijft u gewoon lege haakjes:

variable.method();
Een methode aanroepen zonder argumenten door te geven

Voorbeeld:

System.out.println();

5. Console-invoer

Als we een object hebben Scanner, is het gemakkelijk om gegevens van het toetsenbord te krijgen.

Om een ​​regel van het toetsenbord te lezen , hebt u deze opdracht nodig:

String str = console.nextLine();

Wanneer de uitvoering van het programma deze regel bereikt, zal het pauzeren en wachten tot de gebruiker gegevens invoert en op Enter drukt. Vervolgens wordt alles wat de gebruiker heeft ingevoerd opgeslagen in de variabele str.

Om een ​​getal van het toetsenbord te lezen , heb je deze opdracht nodig:

int number = console.nextInt();

Alles is hier zoals het vorige commando. Wanneer de uitvoering van het programma deze regel bereikt, zal het pauzeren en wachten tot de gebruiker gegevens invoert en op Enter drukt. Daarna wordt alles wat de gebruiker heeft ingevoerd omgezet naar een getal en opgeslagen in de numbervariabele.

Als de gebruiker gegevens heeft ingevoerd die niet kunnen worden geconverteerd naar een geheel getal, genereert het programma een fout en wordt het afgesloten.

Om een ​​gebroken getal van het toetsenbord te lezen , hebt u deze opdracht nodig:

double number = console.nextDouble();

Deze verklaring lijkt erg op die met de nextInt()methode, alleen wordt gecontroleerd of de ingevoerde gegevens kunnen worden omgezet in een doublegetal.

Voorbeeld van een programma dat twee getallen van het toetsenbord leest en hun som op het scherm weergeeft:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      int a = console.nextInt();
      int b = console.nextInt();

      System.out.println(a + b);
   }
}
Opmerking

De gebruiker kan meerdere getallen op een enkele regel invoeren, gescheiden door spaties: de methoden van de Scannerklasse weten hoe ze hiermee om moeten gaan. Dat gezegd hebbende, leest het programma de cijfers pas nadat de gebruiker op drukt Enter.



6. Andere methoden van de Scannerklas

Trouwens, de bovenstaande methoden zijn niet alles wat de Scannerklas te bieden heeft. De volledige lijst met methoden ziet er ongeveer zo uit:

Methode Beschrijving
nextByte()
Leest gegevens en converteert deze naar eenbyte
nextShort()
Leest gegevens en converteert deze naar eenshort
nextInt()
Leest gegevens en converteert deze naar eenint
nextLong()
Leest gegevens en converteert deze naar eenlong
nextFloat()
Leest gegevens en converteert deze naar eenfloat
nextDouble()
Leest gegevens en converteert deze naar eendouble
nextBoolean()
Leest gegevens en converteert deze naar eenboolean
next()
Leest een "token". Tokens worden gescheiden door spaties of drukken op de Enter-toets
nextLine()
Leest een hele regel

Er zijn ook methoden waarmee u het volgende token in de invoer kunt controleren zonder het daadwerkelijk op te halen (om te weten welke methode u moet gebruiken om het te lezen).

Methode Beschrijving
hasNextByte()
Is er een byte? Kan de invoer worden geconverteerd naar een byte?
hasNextShort()
Is er een short? Kan de invoer worden geconverteerd naar een short?
hasNextInt()
Is er een int? Kan de invoer worden geconverteerd naar een int?
hasNextLong()
Is er een long? Kan de invoer worden geconverteerd naar een long?
hasNextFloat()
Is er een float? Kan de invoer worden geconverteerd naar een float?
hasNextDouble()
Is er een double? Kan de invoer worden geconverteerd naar een double?
hasNextBoolean()
Is er een boolean? Kan de invoer worden geconverteerd naar een boolean?
hasNext()
Is er nog een teken?
hasNextLine()
Is er nog een lijn?

7. Gegevens uit een string lezen

We hebben eerder vermeld dat de Scannerklas gegevens uit verschillende bronnen kan lezen. Een van die bronnen is een reeks tekst .

Het ziet er ongeveer zo uit:

String str = "text";
Scanner scanner = new Scanner(str);

Bij het maken van het Scannerobject geven we de string door strin plaats van het System.inobject. En nu scannerzal het object gegevens uit de string lezen. Voorbeeld:

Programmacode: Uitleg:
import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      String str = "10 20 40 60";
      Scanner scanner = new Scanner(str);
      int a = scanner.nextInt();
      int b = scanner.nextInt();

      System.out.println(a + b);
   }
}




// een == 10; 
// b == 20; 
De schermuitvoer is:30