Ввод данных с клавиатуры

В 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, так как он работает быстрее. В остальном выбор зависит от специфики задачи.

Создано