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.out
objektet 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. Scanner
klasse
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.in
objektet 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 Scanner
objekt vil se omtrent slik ut:
Kode | Forklaring |
---|---|
|
Vi lager et Scanner objekt. 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 Scanner
objekt
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";
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);
Alt til venstre for likhetstegnet er deklarasjonen av en variabel med navnet console
hvis type er Scanner
. Du kan i stedet kalle det s
eller scanner
eller 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.in
objektet som datakilde for det nyopprettede Scanner
objektet.
Etter å ha utført hele denne linjen, vil vi ha en Scanner
variabel kalt console
som programmet vårt vil bruke til å lese data fra tastaturet.
4. Liste over metoder
I eksemplet ovenfor Scanner
console
lagrer variabelen vår en referanse til et Scanner
objekt.
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);
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();
Eksempel:
System.out.println();
5. Konsollinngang
Når vi har et Scanner
objekt, 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 double
tall.
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);
}
}
Brukeren kan skrive inn flere tall på en enkelt linje, og skille dem med mellomrom: metodene til klassen Scanner
vet 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 Scanner
klassen
Metodene ovenfor er forresten ikke alt klassen Scanner
har å tilby. Den komplette listen over metoder ser omtrent slik ut:
Metode | Beskrivelse |
---|---|
|
Leser data og konverterer dem til enbyte |
|
Leser data og konverterer dem til enshort |
|
Leser data og konverterer dem til enint |
|
Leser data og konverterer dem til enlong |
|
Leser data og konverterer dem til enfloat |
|
Leser data og konverterer dem til endouble |
|
Leser data og konverterer dem til enboolean |
|
Leser ett "token". Tokens er atskilt med mellomrom eller trykk på enter-tasten |
|
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 |
---|---|
|
Er det en byte ? Kan inngangen konverteres til en byte ? |
|
Er det en short ? Kan inngangen konverteres til en short ? |
|
Er det en int ? Kan inngangen konverteres til en int ? |
|
Er det en long ? Kan inngangen konverteres til en long ? |
|
Er det en float ? Kan inngangen konverteres til en float ? |
|
Er det en double ? Kan inngangen konverteres til en double ? |
|
Er det en boolean ? Kan inngangen konverteres til en boolean ? |
|
Er det en annen token? |
|
Er det en annen linje? |
7. Lese data fra en streng
Vi har tidligere nevnt at Scanner
klassen 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 Scanner
objektet, sender vi inn strengen str
i stedet for System.in
objektet. Og nå scanner
vil objektet lese data fra strengen. Eksempel:
Programkode: | Forklaring: |
---|---|
|
// a == 10;
// b == 20;
Skjermutgangen vil være: |