1. Четене от конзолата с помощта наSystem.in

В предишните уроци се запознахме с командите за извеждане на информация на екрана. За да направим това, използвахме обекта и System.outнеговите методи. Това е просто и удобно.print()println()

Но, Howто вероятно вече се досещате, показването на информация на екрана не е достатъчно за нас. Целта на повечето програми е да направят нещо полезно за потребителя. Това означава, че много често е необходимо потребителят да може да въвежда данни от клавиатурата.

Точно Howто в случая с изхода, имаме и специален обект за въвеждане на данни — System.in. Но, за наше съжаление, това не е толкова удобно, колкото бихме искали. Позволява ни да четем данни от клавиатурата символ по знак.

За да подобрим това, ще използваме друг клас, който, когато е сдвоен с System.inобекта, ще ни даде всичко, от което се нуждаем. От дълго време Java има класове, подходящи за всеки повод. И сега ще се запознаем с един от тях.


2. Scannerклас

Класът Scanner(пълно име: java.util.Scanner) може да чете данни от различни източници, например конзола, файлове и интернет. Ако искаме да чете данни от клавиатурата, тогава трябва да предадем обекта System.inкато аргумент, който ще служи като източник на данни. И тогава обектът Scanner ще разбере Howво да прави с него.

Четенето от клавиатурата с помощта на Scannerобект би изглеждало така:

Код Обяснение
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Ние създаваме Scannerобект.
Четем ред текст от клавиатурата.
Четем число от клавиатурата.

Изглежда лесно, но наистина ли е толкова просто?

Мисля, че трябва да имате куп въпроси и сега ще отговорим на тях.

Но първо, нека демонстрираме пример за пълна програма, която използва 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. Създаване на Scannerобект

Първият въпрос е Howва е тази линия Scanner console = new Scanner (System.in);?

Този ред може да е объркващ, но ще виждате подобни неща през цялото време. Затова смятаме, че е важно да обясним Howво се случва тук.

Спомнете си How обикновено създаваме променлива с текст:

String str = "text";
Деклариране и инициализиране на низова променлива

Първо записваме типа на променливата ( String), след това нейното име ( str) и накрая след знака за equalsство записваме стойността.

Нашата объркваща линия всъщност е същата:

Scanner console = new Scanner(System.in);
Деклариране и инициализиране на Scannerпроменлива

Всичко отляво на знака за equalsство е декларацията на променлива с име, consoleчийто тип е Scanner. Вместо това можете да го наречете s or scanneror дори keyboard. Тогава codeът ще изглежда така:

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

Мисля, че това прави всичко много по-ясно.

Но codeът вдясно от знака за equalsство е малко по-сложен. Сега имам предвид new Scanner(System.in); Това каза, че тук също не се случва нищо свръхестествено.

В този code казваме на Java машината: създайте нов обект (ключовата newдума), чийто тип е Scanner , предавайки обекта System.inкато източник на данни за новосъздадения Scannerобект.

След като изпълним целия този ред, ще имаме Scannerпроменлива с име console , която нашата програма ще използва за четене на данни от клавиатурата.


4. Списък на методите

В горния пример нашата Scanner consoleпроменлива съхранява препратка към Scannerобект.

За да извикате методи на обект, към който се отнася променлива, пишете точка след името на променливата, последвана от името на метода и всички аргументи. Общият вид на командата е следният:

variable.method(arguments);
Извикване на метод на обект, към който се отнася променлива

Примери:

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

Ако не планирате да предавате аргументи на функция, тогава просто пишете празни скоби:

variable.method();
Извикване на метод без предаване на аргументи

Пример:

System.out.println();

5. Конзолен вход

Когато имаме Scannerобект, е лесно да получим данни от клавиатурата.

За да прочетете ред от клавиатурата , имате нужда от тази команда:

String str = console.nextLine();

Когато изпълнението на програмата достигне този ред, тя ще спре и ще изчака потребителя да въведе данни и да натисне enter. Тогава всичко, въведено от потребителя, се съхранява в променливата str.

За да прочетете число от клавиатурата , имате нужда от тази команда:

int number = console.nextInt();

Всичко тук е като предишната команда. Когато изпълнението на програмата достигне този ред, тя ще спре и ще изчака потребителя да въведе данни и да натисне enter. След това всичко въведено от потребителя се преобразува в число и се съхранява в променливата number.

Ако потребителят е въвел данни, които не могат да бъдат преобразувани в цяло число, програмата ще генерира грешка и ще излезе.

За да прочетете дробно число от клавиатурата , имате нужда от тази команда:

double number = console.nextDouble();

Този оператор е много подобен на този с nextInt()метода, само че проверява дали въведените данни могат да бъдат преобразувани в doubleчисло.

Пример за програма, която чете две числа от клавиатурата и извежда сумата им на екрана:

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);
   }
}
Забележка

Потребителят може да въведе няколко числа на един ред, като ги раздели с интервали: методите на Scannerкласа знаят How да се справят с това. Въпреки това, програмата чете числата само след като потребителят натисне Enter.



6. Други методи на Scannerкласа

Между другото, методите по-горе не са всичко, което класът Scannerможе да предложи. Пълният списък с методи изглежда така:

Метод Описание
nextByte()
Чете данни и ги преобразува в abyte
nextShort()
Чете данни и ги преобразува в ashort
nextInt()
Чете данни и ги преобразува вint
nextLong()
Чете данни и ги преобразува в along
nextFloat()
Чете данни и ги преобразува в afloat
nextDouble()
Чете данни и ги преобразува в adouble
nextBoolean()
Чете данни и ги преобразува в aboolean
next()
Чете един "жетон". Токените се разделят с интервали or натискане на клавиша enter
nextLine()
Чете цял ред

Има и методи, които ви позволяват да проверявате следващия токен във входа, без действително да го извличате (за да знаете кой метод да използвате, за да го прочетете).

Метод Описание
hasNextByte()
Има ли byte? Може ли входът да бъде преобразуван в byte?
hasNextShort()
Има ли short? Може ли входът да бъде преобразуван в short?
hasNextInt()
Има ли int? Може ли входът да бъде преобразуван в int?
hasNextLong()
Има ли long? Може ли входът да бъде преобразуван в long?
hasNextFloat()
Има ли float? Може ли входът да бъде преобразуван в float?
hasNextDouble()
Има ли double? Може ли входът да бъде преобразуван в double?
hasNextBoolean()
Има ли boolean? Може ли входът да бъде преобразуван в boolean?
hasNext()
Има ли друг жетон?
hasNextLine()
Има ли друга линия?

7. Четене на данни от низ

По-рано споменахме, че Scannerкласът може да чете данни от различни източници. Един от тези източници е низ от текст .

Изглежда нещо подобно:

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

Когато създаваме Scannerобекта, ние предаваме низа strinstead of System.inобекта. И сега scannerобектът ще прочете данни от низа. Пример:

Програмен code: Обяснение:
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; 
Изходът на екрана ще бъде:30