Ввод с клавиатуры
Для того чтобы пользователь мог что-то ввести с клавиатуры, существует стандартный поток ввода, представленный объектом System.in. Рассмотрим, как это происходит.
Для ввода данных с клавиатуры в Java используется метод System.in.read() — он возвращает код введенного символа. После его выполнения JVM останавливает программу и ждет, пока пользователь введет символ с клавиатуры. Для того чтобы вывести сам символ на консоль, выполняется его приведение к типу char :
public class SystemInDemo < public static void main(String[] args) throws IOException < int x = System.in.read(); char c = (char) x; System.out.println("Код символа: " + c + " language-java">import java.util.Scanner;
Методы этого класса позволяют считывать строку, значение типа int или double .
Методы класса Scanner :
- hasNextInt() - возвращает true если с потока ввода можно считать целое число.
- nextInt() - считывает целое число с потока ввода.
- hasNextDouble() - проверяет, можно ли считать с потока ввода вещественное число типа double .
- nextDouble() - считывает вещественное число с потока ввода.
- nextLine() - позволяет считывать целую последовательность символов, то есть строку.
- hasNext() - проверяет, а остались ли в потоке ввода какие-то символы.
В следующем примере метод hasNextInt() проверяет, ввел ли пользователь целое число. И с помощью метода nextInt() считываем введенное число. Если пользователь ввел строку, то программа выведет на консоль "Вы ввели не целое число":
import java.util.Scanner; public class ScannerDemo1 < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); System.out.print("Введите целое число: "); if (scanner.hasNextInt()) < int i = scanner.nextInt(); System.out.println(i); >else < System.out.println("Вы ввели не целое число"); >> >
Рассмотрим пример, в котором используется метод nextDouble() для считывания дробного числа. Если же пользователь введет строку, то программа завершится с ошибкой времени выполнения. Чтобы этого не происходило, перед вызовом метода nextDouble() , сделайте проверку с помощью метода hasNextDouble() :
import java.util.Scanner; public class ScannerDemo2 < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); // если ввести букву s, // то случится ошибка во время исполнения double i = scanner.nextDouble(); System.out.println(i); >>
Следующий пример использует метод nextLine() для считывания всей строки:
import java.util.Scanner; public class ScannerDemo3 < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); String s1, s2; s1 = scanner.nextLine(); s2 = scanner.nextLine(); System.out.println(s1 + s2); >>
Презентацию с видео можно скачать на Patreon .
Ввод данных с клавиатуры
В Java используются два основных способа ввода данных с клавиатуры:
- С помощью метода readLine() объекта, порожденного от класса BufferdReader из пакета java.io.
- С помощью nextLine() и других методов объекта, созданного от класса Scanner из пакета java.util.
Однако в обоих случаях изначально используется System.in – объект класса InputStream, присвоенный переменной in, находящейся в классе System пакета java.lang. Данный объект выполняет функцию стандартного потока ввода, т. е. ввода с клавиатуры. (В то время как System.out – стандартный поток вывода.)
В Java объект System.in обеспечивает низкоуровневый ввод, при котором методом read() считываются байты. Например, если ввести "ab" и нажать Enter, будет прочитано три байта. В десятичном представлении значение первого байта будет соответствовать символу "a" по таблице символов, второго – символу "b", третьего – символу перехода на новую строку.
Если же ввести букву национального алфавита, которая не может кодироваться одним байтом, то каждый ее составляющий байт будет прочитан по отдельности.
Для преобразования байтов в символы, а затем в строки полученное от System.in передают в конструкторы классов-оберток. Обертки используют функционал переданного им объекта, но дополняют его своим.
Первая обертка – класс InputStreamReader, который преобразует набор байтов в символ. Класс BufferedReader буферизует ввод, обеспечивая считывание из потока ввода (клавиатура это или файл – не важно) целых строк, что делает процесс более быстрым.
import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; public class Buffered { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader( new InputStreamReader(System.in)); String title = reader.readLine(); String pagesStr = reader.readLine(); int pages = Integer.parseInt(pagesStr); System.out.println(title); System.out.println(pages+1); } }
Выражение BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); есть сокращенная запись от:
InputStream a = System.in; InputStreamReader b = new InputStreamReader(a); BufferedReader reader = new BufferedReader(b);
В случае Scanner дело обстоит попроще, так как класс может больше:
import java.util.Scanner; public class Scan public static void main(String[] args) Scanner scanner = new Scanner(System.in); String title = scanner.nextLine(); int pages = scanner.nextInt(); System.out.println(title); System.out.println(pages + 1); > >
У сканера есть методы, проверяющие тип вводимых данных (hasNextInt() и т. п.). Несмотря на удобство Scanner, если надо просто считывать строки без их анализа, предпочитают использовать BufferedReader, так как он работает быстрее. В остальном выбор зависит от специфики задачи.
X Скрыть Наверх
Программирование на Java. Курс
Ввод символов с клавиатуры
Программа считывает введенные данные с клавиатуры (1 символ) и выводит в консоль. Стало интересно, и я захотел поменять char на String и посмотреть как всё будет работать:
import java.io.IOException; public class Test < public static void main(String[] args) throws IOException < String ch; System.out.println("Введите данные в консоль: "); String = (String) System.in.read(); System.out.println(ch); >>
Но идея выдала ошибку:
Inconvertible types; cannot cast 'int' to 'java.lang.String'
Я полез в гугл и нашел вот такую информацию:
Why this is not possible: Because String and Integer are not in the same Object hierarchy.
Object / \ / \ String Integer
The casting which you are trying, works only if they are in the same hierarchy, e.g.
Object / / A / / B
In this case, (A) objB or (Object) objB or (Object) objA will work. Hence as others have mentioned already, to convert an integer to string use: String.valueOf(integer) , or Integer.toString(integer) for primitive, or Integer.toString() for the object.
Далее я попробовал сделать вот так:
String = String.valueOf(ch) System.in.read(); //выдает ошибку: Variable 'ch' might not have been initialized
String = Integer.toString(ch) System.in.read();
Но ничего так и не заработало. Как мне правильно сделать и в чем проблема?
Как вводить с клавиатуры в java
Дело ясное, что дело темное:))) Если бы я не знал, что такое scanner, то ничего бы не понял. То есть, по итогу, я ничего не понял, если кто меня понял:)
24 ноября 2023
Из-за того, что эту тему объяснили отвратительно тут, дальнейшие задачи было очень тяжело решать и понимать. Это важная тема, а тут даже не объяснили, для чего это нужно. Пока запомнилось так: просто перепишите себе то, что написано в примере 2 и 3. И, когда в задачах дальше будет фраза " введите число с клавиатуры", то используйте эти выражения, а дальше делайте то, что проходили
8 октября 2023
можно ли все курсы этого сайта закончить без оплаты магии ?
8 октября 2023
А за каждое прохождение темы они не дают магию ?
13 сентября 2023
Очень сложно слушать ваши записи, ребята. Почему нельзя было подготовиться и записать структурно и без слов паразитов? Все же вы за это деньги с людей берете. А так ощущение будто вырвали сына маминой подруги и заставили с порога объяснять.
СОБЕРЕМ ОСТАТКИ ВОЛИ И ВЫЙДЕМ НА НОВЫЙ УРОВЕНЬ! Уровень 24
15 июля 2023
"Но System.in и BufferedReader не совместимы друг с другом, поэтому мы используем переходник – еще один объект InputStreamReader" в данном случае под переходником имеется в виду шаблон Адаптер
17 мая 2023
Может, стоило для начала объяснить что такое объекты и классы для того чтобы оперировать этими понятиями, так как на данный момент мы изучили только переменные и методы.
Anonymous #2540859 Уровень 6 Expert
28 апреля 2023
Непонятно: говориться что в System.in храниться объект класса InputStream. Но InputStream это абстрактный класс у него не может быть объектов как так-то?
27 апреля 2023
https://www.youtube.com/watch?v=PZa7LEY_7LM Вот здесь доступно объясняют про
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
100% после прочтения этой бесполезной лекции, вы потеряли нить, зачем это все, посмотрите видеоролик, там очень доступно объясняют про то, как считывается поток вводных данных, что вообще такое поток и т.д Я считаю, что проектировщики плана обучения должны обязательно внести дополнения в эту лекцию, раз они начали здесь уже задвигать про ввод данных, это просто must have. Непонимание этой вещи вредит здоровью хуже, чем курение, наркотики и виски без льда.