1. Читання з консолі, System.in
У попередніх лекціях ми познайомилися з командами виведення на екран. Для цього ми використовували об'єкт System.out, і його методи print() і println(). Просто і зручно.
Але, як ви вже, мабуть, здогадалися, одного виведення на екран недостатньо. Мета більшості програм — зробити щось корисне для користувача. Тому дуже часто потрібно, щоб користувач міг вводити дані з клавіатури.
Як і для виведення, для введення даних також є спеціальний об'єкт — System.in. Але, на жаль для нас, він не настільки зручний, як нам би хотілося. Цей об'єкт дозволяє зчитувати дані з клавіатури по одному символу за раз.
Тому ми скористаємося ще одним класом, який у парі з об'єктом System.in дасть нам усе, що потрібно. У Java вже давно є класи на всі випадки життя. З одним із них ми зараз і познайомимося.
2. Клас Scanner
Клас Scanner (повне ім'я java.util.Scanner) вміє зчитувати дані з різних джерел: консоль, файли, інтернет. Якщо ми хочемо, щоб він зчитував дані з клавіатури, ми повинні передати йому об'єкт System.in як параметр – джерело даних. А вже об'єкт типу Scanner сам розбереться, що з ним робити.
Зчитування з клавіатури за допомогою об'єкта типу Scanner буде виглядати приблизно так:
| Код | Пояснення |
|---|---|
|
Створюємо об'єкт класу 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);
System.out.println("Вік: " + age);
}
}
3. Створення об'єкта Scanner
Перше питання – що це за рядок Scanner console = new Scanner(System.in);?
Такий рядок може збивати з пантелику, однак ви будете постійно зустрічати схожі речі. Тож, вважаємо, настав час пояснити, що тут написано.
Згадаємо, як зазвичай створюємо змінну з текстом:
String str = "текст";
Спочатку ми пишемо тип змінної (String), потім її ім'я (str) і, нарешті, після знака дорівнює записуємо значення.
У нашому дивному рядку насправді все те саме:
Scanner console = new Scanner(System.in);
Scanner
Все, що знаходиться ліворуч від знака дорівнює — це оголошення змінної типу Scanner з ім'ям console. Її можна було б назвати, наприклад, s, або scanner, або навіть keyboard. Тоді код виглядав би так:
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();
Думаю, тепер усе стало набагато зрозуміліше.
А код, що знаходиться праворуч від знака дорівнює, трохи складніший. Мається на увазі new Scanner(System.in); Але й тут нічого космічного.
У цьому коді ми кажемо Java-машині: створи новий об'єкт (слово new) типу Scanner і передай у нього в якості параметра те, з чого новостворений об'єкт Scanner братиме дані — об'єкт System.in.
Після виконання цього рядка у нас з'явиться змінна з ім'ям console типу Scanner, за допомогою якої наша програма зможе зчитувати дані з клавіатури.
4. Виклик методів
У наведеному вище прикладі наша змінна console типу Scanner зберігала у себе всередині посилання на об'єкт типу Scanner.
Щоб викликати методи об'єкта, на який посилається змінна, потрібно після імені змінної написати крапку, а потім ім'я методу і параметри. Загальний вигляд цієї команди такий:
змінна.метод(параметри);
Приклади:
System.out.println("Привіт");
System.out.println(1);
Якщо ви не плануєте передавати в функцію параметри, потрібно писати просто порожні дужки:
змінна.метод();
Приклад:
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. Однак числа будуть зчитані програмою лише після того, як користувач натисне Enter.
6. Інші методи класу Scanner
Це, до речі, були не всі методи класу Scanner. Повний список виглядає приблизно так:
| Метод | Опис |
|---|---|
|
Зчитує дані і перетворює їх в тип byte |
|
Зчитує дані і перетворює їх в тип short |
|
Зчитує дані і перетворює їх в тип int |
|
Зчитує дані і перетворює їх в тип long |
|
Зчитує дані і перетворює їх в тип float |
|
Зчитує дані і перетворює їх в тип double |
|
Зчитує дані і перетворює їх в тип boolean |
|
Зчитує одне «слово». Слова розділяються пробілами або enter |
|
Зчитує цілий рядок |
Є ще методи, які дозволяють перевірити тип ще не зчитаних даних (щоб знати, яким методом їх зчитувати).
| Метод | Опис |
|---|---|
|
Там тип byte? Його можна буде перетворити на byte? |
|
Там тип short? Його можна буде перетворити на short? |
|
Там тип int? Його можна буде перетворити на int? |
|
Там тип long? Його можна буде перетворити на long? |
|
Там тип float? Його можна буде перетворити на float? |
|
Там тип double? Його можна буде перетворити на double? |
|
Там тип boolean? Його можна буде перетворити на boolean? |
|
Там є ще одне слово? |
|
Там є ще один рядок? |
7. Ввід даних із рядка
Ми вже говорили вище, що клас Scanner уміє зчитувати дані з різних джерел. І одне з цих джерел – рядок тексту.
Виглядати це буде приблизно так:
String str = "текст";
Scanner scanner = new Scanner(str);
Замість об'єкта System.in ми при створенні об'єкта типу Scanner передаємо в нього рядок – str. І тепер об'єкт scanner буде зчитувати дані з рядка. Приклад:
| Код програми: | Пояснення: |
|---|---|
|
// a == 10;
// b == 20;
На екран буде виведено: |
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
a'i вигадувати якісь базові типи, якщо просто можна було зробити все об'єктами і не створювати цеї дихотомії.