1. Lesing fra konsollen ved hjelp avSystem.in

I de forrige leksjonene ble vi kjent med kommandoene for å vise informasjon på skjermen. For å gjøre dette har vi brukt System.outobjektet og dets print()og println()metoder. Det er enkelt og praktisk.

Men, som du sikkert allerede har gjettet, er det ikke nok for oss å vise informasjon på skjermen. Hensikten med de fleste programmer er å gjøre noe nyttig for brukeren. Det betyr at det svært ofte er nødvendig for brukeren å kunne legge inn data fra tastaturet.

Akkurat som tilfellet var for utdata, har vi også et spesielt objekt for datainndata — System.in. Men, dessverre for oss, er det ikke så praktisk som vi ønsker. Den lar oss lese data fra tastaturet ett tegn om gangen.

For å forbedre dette, vil vi bruke en annen klasse som, når den er sammenkoblet med objektet System.in, vil gi oss alt vi trenger. Java har i lang tid hatt klasser som passer enhver anledning. Og vi skal bli kjent med en av dem nå.


2. Scannerklasse

Klassen Scanner(fullt navn: java.util.Scanner) kan lese data fra forskjellige kilder, f.eks. konsollen, filer og Internett. Hvis vi vil at den skal lese data fra tastaturet, må vi sende inn System.inobjektet som et argument som vil tjene som datakilden. Og så vil skannerobjektet finne ut hva det skal gjøre med det.

Å lese fra tastaturet ved hjelp av et Scannerobjekt vil se omtrent slik ut:

Kode Forklaring
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Vi lager et Scannerobjekt.
Vi leser en tekstlinje fra tastaturet.
Vi leser et tall fra tastaturet.

Det ser enkelt ut, men er det virkelig så enkelt?

Jeg tror du må ha en haug med spørsmål, og nå skal vi svare på dem.

Men først, la oss demonstrere et eksempel på et komplett program som bruker 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. Opprette et Scannerobjekt

Det første spørsmålet er hva er denne linjen Scanner console = new Scanner (System.in);?

Denne linjen kan være forvirrende, men du vil se lignende ting hele tiden. Så vi synes det er viktig å forklare hva som skjer her.

Husk hvordan vi vanligvis lager en variabel med tekst:

String str = "text";
Deklarere og initialisere en strengvariabel

Først skriver vi variabelens type ( String), deretter navnet ( str), og til slutt, etter likhetstegnet, skriver vi verdien.

Vår forvirrende linje er faktisk den samme:

Scanner console = new Scanner(System.in);
Deklarere og initialisere en Scannervariabel

Alt til venstre for likhetstegnet er deklarasjonen av en variabel med navnet consolehvis type er Scanner. Du kan i stedet kalle det s eller scannereller til og med keyboard. Da vil koden se slik ut:

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

Jeg tror det gjør alt mye klarere.

Men koden til høyre for likhetstegnet er litt mer komplisert. Jeg sikter nå til new Scanner(System.in); Når det er sagt, det er ikke noe overnaturlig som skjer her heller.

I denne koden forteller vi Java-maskinen: lag et nytt objekt (nøkkelordet new) hvis type er Scanner , og send inn System.inobjektet som datakilde for det nyopprettede Scannerobjektet.

Etter å ha utført hele denne linjen, vil vi ha en Scannervariabel kalt console som programmet vårt vil bruke til å lese data fra tastaturet.


4. Liste over metoder

I eksemplet ovenfor Scanner consolelagrer variabelen vår en referanse til et Scannerobjekt.

For å kalle metoder på et objekt referert til av en variabel, skriver du et punktum etter navnet på variabelen, etterfulgt av metodenavnet og eventuelle argumenter. Det generelle utseendet til kommandoen er som følger:

variable.method(arguments);
Kalle en metode på et objekt referert av en variabel

Eksempler:

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

Hvis du ikke planlegger å sende argumenter til en funksjon, skriver du bare tomme parenteser:

variable.method();
Å kalle en metode uten å sende argumenter

Eksempel:

System.out.println();

5. Konsollinngang

Når vi har et Scannerobjekt, er det enkelt å hente data fra tastaturet.

For å lese en linje fra tastaturet trenger du denne kommandoen:

String str = console.nextLine();

Når kjøringen av programmet når denne linjen, vil det pause og vente på at brukeren legger inn data og trykker enter. Da lagres alt som brukeren skrev inn i variabelen str.

For å lese et tall fra tastaturet trenger du denne kommandoen:

int number = console.nextInt();

Alt her er som den forrige kommandoen. Når kjøringen av programmet når denne linjen, vil det pause og vente på at brukeren legger inn data og trykker enter. Etter det konverteres alt som brukeren skrev inn til et tall og lagres i variabelen number.

Hvis brukeren skrev inn data som ikke kan konverteres til et heltall, vil programmet generere en feil og avslutte.

For å lese et brøktall fra tastaturet trenger du denne kommandoen:

double number = console.nextDouble();

Denne setningen er veldig lik den med nextInt()metoden, bare den sjekker at de angitte dataene kan konverteres til et doubletall.

Eksempel på et program som leser to tall fra tastaturet og viser summen deres på skjermen:

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

Brukeren kan skrive inn flere tall på en enkelt linje, og skille dem med mellomrom: metodene til klassen Scannervet hvordan de skal håndtere dette. Når det er sagt, leser programmet tallene først etter at brukeren har trykket på Enter.



6. Andre metoder i Scannerklassen

Metodene ovenfor er forresten ikke alt klassen Scannerhar å tilby. Den komplette listen over metoder ser omtrent slik ut:

Metode Beskrivelse
nextByte()
Leser data og konverterer dem til enbyte
nextShort()
Leser data og konverterer dem til enshort
nextInt()
Leser data og konverterer dem til enint
nextLong()
Leser data og konverterer dem til enlong
nextFloat()
Leser data og konverterer dem til enfloat
nextDouble()
Leser data og konverterer dem til endouble
nextBoolean()
Leser data og konverterer dem til enboolean
next()
Leser ett "token". Tokens er atskilt med mellomrom eller trykk på enter-tasten
nextLine()
Leser en hel linje

Det finnes også metoder som lar deg sjekke neste token i inndataene uten å faktisk hente den (for å vite hvilken metode du skal bruke for å lese den).

Metode Beskrivelse
hasNextByte()
Er det en byte? Kan inngangen konverteres til en byte?
hasNextShort()
Er det en short? Kan inngangen konverteres til en short?
hasNextInt()
Er det en int? Kan inngangen konverteres til en int?
hasNextLong()
Er det en long? Kan inngangen konverteres til en long?
hasNextFloat()
Er det en float? Kan inngangen konverteres til en float?
hasNextDouble()
Er det en double? Kan inngangen konverteres til en double?
hasNextBoolean()
Er det en boolean? Kan inngangen konverteres til en boolean?
hasNext()
Er det en annen token?
hasNextLine()
Er det en annen linje?

7. Lese data fra en streng

Vi har tidligere nevnt at Scannerklassen kan lese data fra ulike kilder. En av disse kildene er en tekststreng .

Det ser omtrent slik ut:

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

Når vi lager Scannerobjektet, sender vi inn strengen stri stedet for System.inobjektet. Og nå scannervil objektet lese data fra strengen. Eksempel:

Programkode: Forklaring:
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; 
Skjermutgangen vil være:30