1. Avläsning från konsolen med hjälp avSystem.in

I de tidigare lektionerna har vi bekantat oss med kommandona för att visa information på skärmen. För att göra detta har vi använt System.outobjektet och dess print()och println()metoder. Det är enkelt och bekvämt.

Men, som du säkert redan gissat, räcker det inte för oss att visa information på skärmen. Syftet med de flesta program är att göra något användbart för användaren. Det betyder att det mycket ofta är nödvändigt för användaren att kunna mata in data från tangentbordet.

Precis som fallet var för utdata har vi också ett speciellt objekt för datainmatning — System.in. Men tyvärr för oss är det inte så bekvämt som vi skulle vilja. Det låter oss läsa data från tangentbordet ett tecken i taget.

För att förbättra detta kommer vi att använda en annan klass som, när den paras ihop med objektet, System.inger oss allt vi behöver. Sedan länge har Java haft klasser som passar alla tillfällen. Och vi ska lära känna en av dem nu.


2. Scannerklass

Klassen Scanner(fullständigt namn: java.util.Scanner) kan läsa data från olika källor, t.ex. konsolen, filer och Internet. Om vi ​​vill att den ska läsa data från tangentbordet måste vi skicka in objektet System.insom ett argument som kommer att fungera som datakällan. Och sedan kommer Scanner-objektet att ta reda på vad det ska göra med det.

Att läsa från tangentbordet med ett Scannerobjekt skulle se ut ungefär så här:

Koda Förklaring
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Vi skapar ett Scannerobjekt.
Vi läser en textrad från tangentbordet.
Vi läser ett nummer från tangentbordet.

Det ser enkelt ut, men är det verkligen så enkelt?

Jag tror att du måste ha en massa frågor, och nu ska vi svara på dem.

Men först, låt oss visa ett exempel på ett komplett program som använder klassen Scanner:

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. Skapa ett Scannerobjekt

Den första frågan är vad är denna linje Scanner console = new Scanner (System.in);?

Den här raden kan vara förvirrande, men du kommer att se liknande saker hela tiden. Så vi tycker att det är viktigt att förklara vad som händer här.

Kom ihåg hur vi vanligtvis skapar en variabel med text:

String str = "text";
Deklarera och initiera en strängvariabel

Först skriver vi variabelns typ ( String), sedan dess namn ( str), och slutligen, efter likhetstecknet, skriver vi värdet.

Vår förbryllande linje är faktiskt densamma:

Scanner console = new Scanner(System.in);
Deklarera och initiera en Scannervariabel

Allt till vänster om likhetstecknet är deklarationen av en variabel som heter consolevars typ är Scanner. Du kan istället kalla det s eller scannereller till och med keyboard. Då skulle koden se ut så här:

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();

Jag tror att det gör allt mycket tydligare.

Men koden till höger om likhetstecknet är lite mer komplicerad. Jag syftar nu på new Scanner(System.in); Som sagt, det händer inget övernaturligt här heller.

I den här koden säger vi till Java-maskinen: skapa ett nytt objekt (nyckelordet new) vars typ är Scanner , och skicka in System.inobjektet som datakälla för det nyskapade Scannerobjektet.

Efter att ha kört hela raden kommer vi att ha en Scannervariabel som heter console som vårt program kommer att använda för att läsa data från tangentbordet.


4. Lista över metoder

I exemplet ovan Scanner consolelagrar vår variabel en referens till ett Scannerobjekt.

För att anropa metoder på ett objekt som refereras av en variabel skriver du en punkt efter variabelns namn, följt av metodnamnet och eventuella argument. Kommandots allmänna utseende är som följer:

variable.method(arguments);
Anropa en metod på ett objekt som refereras av en variabel

Exempel:

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

Om du inte planerar att skicka argument till en funktion, skriver du bara tomma parenteser:

variable.method();
Anropa en metod utan att skicka argument

Exempel:

System.out.println();

5. Konsolingång

När vi har ett Scannerobjekt är det lätt att få data från tangentbordet.

För att läsa en rad från tangentbordet behöver du det här kommandot:

String str = console.nextLine();

När exekveringen av programmet når denna rad, pausar det och väntar på att användaren ska mata in data och trycka på enter. Sedan lagras allt som användaren skrivit in i variabeln str.

För att läsa ett nummer från tangentbordet behöver du det här kommandot:

int number = console.nextInt();

Allt här är som det föregående kommandot. När exekveringen av programmet når denna rad, pausar det och väntar på att användaren ska mata in data och trycka på enter. Därefter omvandlas allt som användaren angett till ett tal och lagras i variabeln number.

Om användaren angav data som inte kan konverteras till ett heltal kommer programmet att generera ett fel och avslutas.

För att läsa ett bråktal från tangentbordet behöver du detta kommando:

double number = console.nextDouble();

Detta uttalande är väldigt likt det med metoden nextInt(), bara det kontrollerar att inmatade data kan konverteras till ett doubletal.

Exempel på ett program som läser två siffror från tangentbordet och visar deras summa på skärmen:

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

Användaren kan ange flera siffror på en enda rad, separera dem med mellanslag: klassens metoder Scannervet hur man hanterar detta. Som sagt, programmet läser siffrorna först efter att användaren tryckt på Enter.



6. Andra metoder i Scannerklassen

Förresten, metoderna ovan är inte allt som Scannerklassen har att erbjuda. Den kompletta listan över metoder ser ut ungefär så här:

Metod Beskrivning
nextByte()
Läser data och konverterar den till enbyte
nextShort()
Läser data och konverterar den till enshort
nextInt()
Läser data och konverterar den till enint
nextLong()
Läser data och konverterar den till enlong
nextFloat()
Läser data och konverterar den till enfloat
nextDouble()
Läser data och konverterar den till endouble
nextBoolean()
Läser data och konverterar den till enboolean
next()
Läser en "token". Tokens separeras med mellanslag eller tryck på enter-tangenten
nextLine()
Läser en hel rad

Det finns också metoder som låter dig kontrollera nästa token i inmatningen utan att faktiskt hämta den (för att veta vilken metod du ska använda för att läsa den).

Metod Beskrivning
hasNextByte()
Finns det en byte? Kan ingången konverteras till en byte?
hasNextShort()
Finns det en short? Kan ingången konverteras till en short?
hasNextInt()
Finns det en int? Kan ingången konverteras till en int?
hasNextLong()
Finns det en long? Kan ingången konverteras till en long?
hasNextFloat()
Finns det en float? Kan ingången konverteras till en float?
hasNextDouble()
Finns det en double? Kan ingången konverteras till en double?
hasNextBoolean()
Finns det en boolean? Kan ingången konverteras till en boolean?
hasNext()
Finns det en annan token?
hasNextLine()
Finns det en annan linje?

7. Läsa data från en sträng

Vi har tidigare nämnt att Scannerklassen kan läsa data från olika källor. En av dessa källor är en textsträng .

Det ser ut ungefär så här:

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

När vi skapar Scannerobjektet skickar vi in ​​strängen stristället för System.inobjektet. Och nu scannerkommer objektet att läsa data från strängen. Exempel:

Programkod: Förklaring:
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);
   }
}


//a == 10; 
// b == 20; 
Skärmutgången blir:30