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.out
objektumot é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.in
mindent 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. Scanner
osztály
Az Scanner
osztá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.in
objektumot 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 Scanner
objektum segítségével történő olvasás a következőképpen nézne ki:
Kód | Magyarázat |
---|---|
|
Létrehozunk egy Scanner objektumot. Szövegsortolvasunk 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 Scanner
osztá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. Scanner
Objektum 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";
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);
Az egyenlőségjeltől balra minden egy olyan változó deklarációja, console
amelynek típusa Scanner
. Ehelyett hívhatod s
vagy scanner
vagy 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 new
kulcsszót), amelynek típusa Scanner
, és adja át az System.in
objektumot az újonnan létrehozott objektum adatforrásaként Scanner
.
Az egész sor végrehajtása után lesz egy Scanner
nevű 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
console
a 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);
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();
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);
}
}
A felhasználó több számot is beírhat egy sorba, szóközzel elválasztva: az Scanner
osztá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
.
Scanner
6. Az osztály egyéb metódusai
Mellesleg, a fenti metódusok nem minden, amit az Scanner
osztály kínál. A módszerek teljes listája így néz ki:
Módszer | Leírás |
---|---|
|
Adatokat olvas és konvertál abyte |
|
Adatokat olvas és konvertál ashort |
|
Beolvassa az adatokat és átalakítja egyint |
|
Adatokat olvas és konvertál along |
|
Adatokat olvas és konvertál afloat |
|
Adatokat olvas és konvertál adouble |
|
Adatokat olvas és konvertál aboolean |
|
Olvas egy "token". A tokeneket szóközzel vagy az Enter billentyű lenyomásával választja el |
|
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 |
---|---|
|
Van egy byte ? Átalakítható a bemenet byte ? |
|
Van egy short ? Átalakítható a bemenet short ? |
|
Van egy int ? Átalakítható a bemenet int ? |
|
Van egy long ? Átalakítható a bemenet long ? |
|
Van egy float ? Átalakítható a bemenet float ? |
|
Van egy double ? Átalakítható a bemenet double ? |
|
Van egy boolean ? Átalakítható a bemenet boolean ? |
|
Van másik token? |
|
Van másik vonal? |
7. Adatok olvasása karakterláncból
Korábban már említettük, hogy az Scanner
osztá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 Scanner
a karakterláncot adjuk át . És most az objektum adatokat fog olvasni a karakterláncból. Példa:str
System.in
scanner
Program kód: | Magyarázat: |
---|---|
|
// a == 10;
// b == 20;
A képernyő kimenete a következő lesz: |