1. Odczyt z konsoli,System.in

Na poprzednich wykładach zapoznaliśmy się z komendami wyświetlania. W tym celu użyliśmy obiektu System.out, jego metod print()i println(). Proste i wygodne.

Ale jak już pewnie się domyślacie, jedno wyjście na ekran to za mało. Celem większości programów jest zrobienie czegoś pożytecznego dla użytkownika. Dlatego bardzo często konieczne jest, aby użytkownik mógł wprowadzać dane z klawiatury.

Jeśli chodzi o dane wyjściowe, istnieje również specjalny obiekt do wprowadzania danych - System.in. Ale niestety dla nas nie jest to tak wygodne, jak byśmy chcieli. Ten obiekt umożliwia odczytywanie danych z klawiatury po jednym znaku na raz.

Dlatego skorzystamy z innej klasy, która w połączeniu z obiektem System.inda nam wszystko, czego potrzebujemy. Java od dawna ma zajęcia na każdą okazję. Jednego z nich poznamy teraz.


2. KlasaScanner

Klasa Scanner(pełna nazwa java.util.Scanner) może odczytywać dane z różnych źródeł: konsoli, plików, internetu. Jeśli chcemy, aby odczytywał dane z klawiatury, musimy przekazać mu System.injako parametr obiekt - źródło danych. A obiekt typu Scanner wymyśli, co z nim zrobić.

Czytanie z klawiatury za pomocą obiektu typu Scannerwyglądałoby mniej więcej tak:

Kod Wyjaśnienie
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Tworzymy obiekt klasy Scanner. Czytamy linię tekstu
z klawiatury . Odczytujemy numer z klawiatury .

Wydaje się proste, ale czy naprawdę jest takie proste?

Myślę, że masz wiele pytań, a teraz na nie odpowiemy.

Ale najpierw pokażmy przykład kompletnego programu, w którym użyto klasy 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. Utwórz obiektScanner

Pierwsze pytanie brzmi: co to za ciąg znaków Scanner console = new Scanner (System.in);?

Taka linia może być myląca, ale przez cały czas będziesz widzieć podobne rzeczy. Uważamy więc, że nadszedł czas, aby wyjaśnić, co jest tutaj napisane.

Przypomnij sobie, jak zwykle tworzymy zmienną z tekstem:

String str = "text";
Deklarowanie i inicjowanie zmiennej łańcuchowej

Najpierw wpisujemy typ zmiennej ( String), następnie jej nazwę ( str), a na końcu po znaku równości wpisujemy wartość.

W naszej dziwnej linii wszystko jest w rzeczywistości takie samo:

Scanner console = new Scanner(System.in);
Deklarowanie i inicjowanie zmiennej typuScanner

Wszystko na lewo od znaku równości jest deklaracją zmiennej według nazwy console typu Scanner. Można to nazwać na przykład s lub scanner, a nawet keyboard. Wtedy kod wyglądałby tak:

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

Myślę, że teraz wszystko stało się znacznie jaśniejsze.

A kod po prawej stronie znaku równości jest nieco bardziej skomplikowany. Znaczenie new Scanner(System.in); Ale tutaj też nie ma nic kosmicznego.

W tym kodzie mówimy do maszyny Javy: utwórz nowy obiekt (word new) typu Scanner i podaj do niego jako parametr z czego nowo utworzony obiekt Scannerbędzie pobierał dane - object System.in.

Po wykonaniu całej tej linii będziemy mieli zmienną  type Scanner o nazwie console, za pomocą której nasz program będzie mógł odczytywać dane z klawiatury.


4. Metody wywoływania

W powyższym przykładzie nasza zmienna Scanner console zawierała odwołanie do obiektu typu Scanner.

Aby wywołać metody na obiekcie, do którego odwołuje się zmienna, wpisz kropkę po nazwie zmiennej, a następnie nazwę metody i parametry. Ogólna postać tego polecenia jest następująca:

variable.method(arguments);
Wywołanie metody na obiekcie, do którego odwołuje się zmienna

Przykłady:

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

Jeśli nie planujesz przekazywać parametrów do funkcji, wystarczy napisać puste nawiasy:

variable.method();
Wywołanie metody bez przekazywania parametrów

Przykład:

System.out.println();

5. Wprowadzanie danych z konsoli

Wprowadzanie danych z klawiatury gdy mamy obiekt typu Scannerjest bardzo proste.

Aby odczytać ciąg znaków z klawiatury , potrzebujesz polecenia:

String str = console.nextLine();

Gdy program osiągnie wykonanie tej linii, zatrzyma się i zaczeka, aż użytkownik wprowadzi dane i naciśnie klawisz Enter. Następnie wszystko, co wprowadził użytkownik, zostanie zapisane w zmiennej str.

Aby odczytać liczbę z klawiatury , potrzebujesz polecenia:

int number = console.nextInt();

Wszystko jest podobne do poprzedniego polecenia. Gdy program osiągnie wykonanie tej linii, zatrzyma się i zaczeka, aż użytkownik wprowadzi dane i naciśnie klawisz Enter. Następnie wszystko, co wprowadził użytkownik, zostanie przekonwertowane na liczbę i zapisane w zmiennej number.

Jeśli użytkownik wprowadzi dane, których nie można przekonwertować na liczbę całkowitą, program wygeneruje błąd i zakończy działanie.

Aby odczytać liczbę ułamkową z klawiatury , potrzebujesz polecenia:

double number = console.nextDouble();

To polecenie jest dokładnie takie samo jak polecenie nextInt(), tylko sprawdza , czy wprowadzone dane można zamienić na liczbę double.

Przykład programu, który odczytuje z klawiatury dwie liczby i wyświetla ich sumę:

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

Użytkownik może wprowadzić wiele liczb w jednym wierszu oddzielonych spacjami: ta sytuacja zostanie poprawnie obsłużona metodami programu Scanner. Jednak numery zostaną odczytane przez program dopiero po naciśnięciu przez użytkownika Enter.



6. Inne metody klasoweScanner

Nawiasem mówiąc, nie były to wszystkie metody Scanner. Pełna lista będzie wyglądać mniej więcej tak:

metoda Opis
nextByte()
Odczytuje dane i konwertuje je na typ byte
nextShort()
Odczytuje dane i konwertuje je na typ short
nextInt()
Odczytuje dane i konwertuje je na typ int
nextLong()
Odczytuje dane i konwertuje je na typ long
nextFloat()
Odczytuje dane i konwertuje je na typ float
nextDouble()
Odczytuje dane i konwertuje je na typ double
nextBoolean()
Odczytuje dane i konwertuje je na typ boolean
next()
Czyta jedno „słowo”. Słowa są oddzielone spacjami lub enterem
nextLine()
Czyta całą linię

Istnieją również metody, które pozwalają na sprawdzenie typu danych, które nie zostały jeszcze odczytane (aby wiedzieć, którą metodą je odczytać).

metoda Opis
hasNextByte()
Czy istnieje typ byte? Czy można go przekonwertować byte?
hasNextShort()
Czy istnieje typ short? Czy można go przekonwertować short?
hasNextInt()
Czy istnieje typ int? Czy można go przekonwertować int?
hasNextLong()
Czy istnieje typ long? Czy można go przekonwertować long?
hasNextFloat()
Czy istnieje typ float? Czy można go przekonwertować float?
hasNextDouble()
Czy istnieje typ double? Czy można go przekonwertować double?
hasNextBoolean()
Czy istnieje typ boolean? Czy można go przekonwertować boolean?
hasNext()
Czy jest inne słowo?
hasNextLine()
Czy jest tam inna linia?

7. Wprowadzanie danych z ciągu znaków

Powiedzieliśmy już powyżej, że klasa Scanner może odczytywać dane z różnych źródeł. A jednym z tych źródeł jest linia tekstu.

Będzie to wyglądać mniej więcej tak

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

When creating the Scanner object, we pass in the string str instead of the System.in object. And now the scanner object will read data from the string. Example:

Kod programu: Wyjaśnienie:
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; 
Na ekranie pojawi się:30