1. Olvasás a konzolról a segítségévelSystem.in

Az előző leckékben megismerkedtünk az információk képernyőn történő megjelenítésére szolgáló parancsokkal. Ehhez az System.outobjektumot és annak print()metódusait használtuk println(). Egyszerű és kényelmes.

De ahogy valószínűleg már sejtette, az információk képernyőn való megjelenítése nem elegendő számunkra. A legtöbb program célja, hogy valami hasznosat tegyen a felhasználó számára. Ez azt jelenti, hogy nagyon gyakran szükséges, hogy a felhasználó be tudjon írni adatokat a billentyűzetről.

Csakúgy, mint a kimenet esetében, van egy speciális objektumunk az adatbevitelhez - System.in. De sajnos számunkra ez nem olyan kényelmes, mint szeretnénk. Lehetővé teszi, hogy a billentyűzetről egy-egy karaktert olvassunk ki .

Ennek javítására egy másik osztályt fogunk használni, amely az objektummal párosítva System.inmindent megad, amire szükségünk van. A Java már régóta minden alkalomhoz megfelelő osztályokkal rendelkezik. És most megismerjük az egyiket.


2. Scannerosztály

Az Scannerosztály (teljes név: java.util.Scanner) képes különböző forrásokból származó adatokat olvasni, pl. a konzolról, fájlokról és az internetről. Ha azt akarjuk, hogy adatokat olvasson a billentyűzetről, akkor át kell adnunk az System.inobjektumot argumentumként, amely adatforrásként fog szolgálni. És akkor a Scanner objektum kitalálja, hogy mit kezdjen vele.

A billentyűzetről egy Scannerobjektum segítségével történő olvasás a következőképpen nézne ki:

Kód Magyarázat
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Létrehozunk egy Scannerobjektumot. Szövegsort
olvasunk a billentyűzetről. Kiolvasunk egy számot a billentyűzetről.

Egyszerűnek tűnik, de tényleg ilyen egyszerű?

Szerintem van egy csomó kérdésed, és most megválaszoljuk őket.

De először mutassunk meg egy példát egy teljes programra, amely az Scannerosztályt használja:

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. ScannerObjektum létrehozása

Az első kérdés az, hogy mi ez a vonal Scanner console = new Scanner (System.in);?

Lehet, hogy ez a vonal zavaró, de mindig hasonló dolgokat fog látni. Ezért fontosnak tartjuk, hogy elmagyarázzuk, mi folyik itt.

Emlékezzünk vissza, hogyan hozunk létre változót szöveggel:

String str = "text";
Karakterláncváltozó deklarálása és inicializálása

Először felírjuk a változó típusát ( String), majd a nevét ( str), végül az egyenlőségjel után az értéket.

Megdöbbentő vonalunk valójában ugyanaz:

Scanner console = new Scanner(System.in);
ScannerVáltozó deklarálása és inicializálása

Az egyenlőségjeltől balra minden egy olyan változó deklarációja, consoleamelynek típusa Scanner. Ehelyett hívhatod s vagy scannervagy akár keyboard. Akkor a kód így nézne ki:

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

Szerintem így minden sokkal világosabb.

De az egyenlőségjeltől jobbra lévő kód egy kicsit bonyolultabb. Most arra utalok, new Scanner(System.in); hogy azt mondta, itt sem történik semmi természetfeletti.

Ebben a kódban azt mondjuk a Java gépnek: hozzon létre egy új objektumot (a newkulcsszót), amelynek típusa Scanner , és adja át az System.inobjektumot az újonnan létrehozott objektum adatforrásaként Scanner.

Az egész sor végrehajtása után lesz egy Scannernevű változónk console , amelyet a programunk a billentyűzet adatainak olvasására fog használni.


4. Módszerek listája

A fenti példában Scanner consolea változónk egy objektumra való hivatkozást tárol Scanner.

A változó által hivatkozott objektum metódusainak meghívásához a változó neve mögé egy pontot kell írni, amelyet a metódus neve és az esetleges argumentumok követnek. A parancs általános megjelenése a következő:

variable.method(arguments);
Metódus hívása egy változó által hivatkozott objektumon

Példák:

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

Ha nem kíván argumentumokat átadni egy függvénynek, akkor csak üres zárójeleket írjon:

variable.method();
Metódus hívása argumentumok átadása nélkül

Példa:

System.out.println();

5. Konzol bemenet

Ha van objektumunk Scanner, könnyen lekérhetjük az adatokat a billentyűzetről.

Egy sor billentyűzetről történő olvasásához a következő parancsra van szükség:

String str = console.nextLine();

Amikor a program végrehajtása eléri ezt a sort, szünetel, és megvárja, amíg a felhasználó beírja az adatokat és megnyomja az enter billentyűt. Ezután minden, amit a felhasználó beírt, a változóban tárolódik str.

Számok billentyűzetről történő olvasásához a következő parancsra van szükség:

int number = console.nextInt();

Itt minden olyan, mint az előző parancsnál. Amikor a program végrehajtása eléri ezt a sort, szünetel, és megvárja, amíg a felhasználó beírja az adatokat és megnyomja az enter billentyűt. Ezt követően minden, amit a felhasználó beírt, számmá alakul, és a változóban tárolódik number.

Ha a felhasználó olyan adatokat adott meg, amelyeket nem lehet egész számmá alakítani, a program hibát generál és kilép.

Ha törtszámot szeretne olvasni a billentyűzetről , a következő parancsra van szüksége:

double number = console.nextDouble();

Ez az utasítás nagyon hasonlít a metódushoz nextInt(), csak azt ellenőrzi, hogy a bevitt adatok számmá alakíthatók-e double.

Példa egy olyan programra, amely beolvas két számot a billentyűzetről, és megjeleníti azok összegét a képernyőn:

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

A felhasználó több számot is beírhat egy sorba, szóközzel elválasztva: az Scannerosztály metódusai ezt tudják, hogyan kell kezelni. Ennek ellenére a program csak azután olvassa be a számokat, hogy a felhasználó megnyomta a gombot Enter.



Scanner6. Az osztály egyéb metódusai

Mellesleg, a fenti metódusok nem minden, amit az Scannerosztály kínál. A módszerek teljes listája így néz ki:

Módszer Leírás
nextByte()
Adatokat olvas és konvertál abyte
nextShort()
Adatokat olvas és konvertál ashort
nextInt()
Beolvassa az adatokat és átalakítja egyint
nextLong()
Adatokat olvas és konvertál along
nextFloat()
Adatokat olvas és konvertál afloat
nextDouble()
Adatokat olvas és konvertál adouble
nextBoolean()
Adatokat olvas és konvertál aboolean
next()
Olvas egy "token". A tokeneket szóközzel vagy az Enter billentyű lenyomásával választja el
nextLine()
Egy egész sort elolvas

Vannak olyan módszerek is, amelyek lehetővé teszik a következő tokent a bemenetben anélkül, hogy ténylegesen lekérnénk (annak érdekében, hogy megtudjuk, melyik módszert kell használni az olvasáshoz).

Módszer Leírás
hasNextByte()
Van egy byte? Átalakítható a bemenet byte?
hasNextShort()
Van egy short? Átalakítható a bemenet short?
hasNextInt()
Van egy int? Átalakítható a bemenet int?
hasNextLong()
Van egy long? Átalakítható a bemenet long?
hasNextFloat()
Van egy float? Átalakítható a bemenet float?
hasNextDouble()
Van egy double? Átalakítható a bemenet double?
hasNextBoolean()
Van egy boolean? Átalakítható a bemenet boolean?
hasNext()
Van másik token?
hasNextLine()
Van másik vonal?

7. Adatok olvasása karakterláncból

Korábban már említettük, hogy az Scannerosztály különféle forrásokból képes adatokat olvasni. Az egyik ilyen forrás egy szöveglánc .

Valahogy így néz ki:

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

Az objektum létrehozásakor az objektum helyett Scannera karakterláncot adjuk át . És most az objektum adatokat fog olvasni a karakterláncból. Példa:strSystem.inscanner

Program kód: Magyarázat:
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; 
A képernyő kimenete a következő lesz:30