Блок 1. Раздел 2. Тема 2

Класс Scanner.
Считывание символов
с клавиатуры

Вам может понадобиться возможность считать один единственный char. Например, для сохранения символа операции +, -, * или /, если вы пишите калькулятор, или ответа да-нет типа 'y' или 'n'. Между тем Scanner представляет все возможности для считывания слов - он читает строки, целые и дробные числа, большие и малые числа, но вообще не предоставляет возможности прочесть один символ.
Возможно, так сделано потому, что Scanner задумывался как надстройка и расширение над базовой возможностью самого потока ввода System.in, который и предоставляет по сути одну функцию - прочесть символ с клавиатуры. Если вас устраивает возможность прочесть целое слово и при этом взять только самую начальную его букву, то можно написать так:
char c = myscan.next ().charAt (0); 
// next() дает слово, charAt (0) дает его символ под номером 0
// то есть мы получим необходимый нам символ
Функция next возвращает следующее слово, в нём может быть много букв. Более точно такое слово можно назвать String – строка. В строках может быть много букв, и через точку можно вызвать функцию, возвращающую букву по заданному номеру. Эту функцию зовут charAt, в скобках указывается номер символа, который мы хотим получить. Если интересует самый начальный символ, то нужно ввести ноль. Следующий символ будет 1, следующий – 2, и так далее. Это относительно простое решение, но здесь считывается в любом случае целое слово.

Возможно, что вам нужно прочесть один символ (один char), и вы не хотите читать для этого целое слово. Тогда можно написать так:
char c = (char) System.in.read (); 
Теперь символ c можно будет использовать в программе, например, внутри условного оператора if (с == '+') {…}.

Помните, что конкретные значения символов мы указываем в кавычках: 'a', 'b', 'c', '+', '1' и т.д.

Как только вы напишите System.in.read () - система заголосит об ошибке. Чтобы её исправить, надо переиначить шапку main вот так, и все заработает:
public class JavaApplication5 { // осталось как было 
  
    public static void main(String[] args) throws java.io.IOException  { // добавили throws 
Пояснение про throws exception. Эту фразу можно просто прочесть по-английски main throws IOException, что значит: main может кинуть исключения IO, т.е. ввода-вывода (in-out). Исключение - это остановка программы в том месте, когда она не может сработать нормально. То есть в обычных условиях все хорошо, но в исключительных (от сюда и название "исключение") - требуется обработка ошибки. Сейчас, дописав в заголовке main throws exception, мы просто предупредили систему, что это может произойти, и она успокоится.

Функция System.in.read() может кинуть исключение (по-английски throws exception). То есть когда программист видит, что данные явно ошибочны, можно написать "кинуть исключение" (throw exception). Так делает и функция read, если происходит что-то с потоком ввода, например, если клавиатура не подключена. Исключения нужно обрабатывать - писать код, который надо сделать, если произошла плохая ситуация. Мы это пройдем в будущем, а пока что просто передадим исключение наверх - пусть операционная система делает что хочет, если приложение сообщило об ошибке. Обычно она выведет на экран сообщение об ошибке и закроет программу, что нам сейчас и нужно. Чтобы передать исключение наверх, мы и пишем throws java.io.IOException.

Имейте в виду, System.in.read считывает всё по одному символу и, в отличие от Scanner, не разбирает таких тонкостей, как пробел или enter. Поэтому enter тоже считывается как обычный символ – у него есть свой код наравне с другими клавишами, обозначается '\n'. Учитывайте это, ведь обычно человек вводит не просто 'y', чтобы указать программе, как ей работать, но 'y'+'enter'. И второй enter будет считан вторым вызовом System.in.read ()
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Вопрос 1. В чем разница при использовании Scanner и System.in.read() на практике?
Во-первых, мы несколько по-разному пользуемся ими в коде - для Scanner нужно создать какой-либо объект и потом вызывать для этого объекта функции. System.in.read() можно вызвать без создания объекта, просто по имени функции.

Но главное - Scanner дает множество удобных функций для считывания чисел и строк, но строго одиночный символ прочесть не может - он читает слово до ближайшего пробела вызовом next (). А System.in.read() наоборот, читает только один символ за один запуск. Чтобы прочесть ещё пробел или enter, нужно вызвать его ещё раз.
Вопрос 2. Зачем нужно одиночные символы в коде окружать одинарными кавычками ' '?
Иначе компилятор не может различить, вы хотите обратиться к переменной с именем, например, x, или хотите работать с кодом буквы 'x'
Задача 1. Что выведет программа, если человек наберет на клавиатуре abc?
package javaapplication1;
public class JavaApplication1 {
public static void main(String[] args) throws java.io.IOException  {
  char c0 = (char) System.in.read ();
  char c1 = (char) System.in.read ();
  char c2 = (char) System.in.read ();

  System.out.println (c2);
  System.out.println (c1);
  System.out.println (c0);
 }   
}
Ответ
cba
Решение
Программа вводит три символа, сохраняя их в переменные c0, c1, c2. Затем программа выводит их в обратном порядке c2, c1, c0. Так что любые три введенные с клавиатуры символа, будут распечатаны в обратном порядке.
Решайте больше задач по этому разделу здесь.
В следующей теме расскажем про оператор if-else и про логические выражения