System.in: примеры (JAVA)

Использование System.in для чтения данных с консоли
Раздел: Ввод-вывод (I/O) консольный
System.in: InputStream

Описание System.in

System.in - это статическое поле класса System, представляющее стандартный поток ввода (InputStream). Оно обычно подключено к системной консоли и используется для получения данных от пользователя. Это не функция, а объект, который можно обернуть в более удобные классы: Scanner или BufferedReader.

Аргументов нет. System.in возвращает объект InputStream.

Основные методы InputStream: read() (чтение одного байта), read(byte[] b) (чтение массива байтов), available() (проверка доступных байтов без блокировки), close() (закрытие потока).

Примеры использования

Пример 1. Чтение одного байта:

int b = System.in.read();
System.out.println(b);
При вводе символа 'A' вывод: 65

Пример 2. Чтение строки через Scanner:

Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
System.out.println(line);
Ввод: Hello
Вывод: Hello

Пример 3. Чтение строки через BufferedReader:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
System.out.println(line);
Ввод: World
Вывод: World

Пример 4. Чтение нескольких чисел:

Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println("Sum: " + (a+b));
Ввод: 5 7
Вывод: Sum: 12

Похожие возможности в Java

Scanner(System.in) - удобен для разбора токенов, чисел и строк. Поддерживает nextInt(), nextLine(). Неэффективен при больших объёмах.

BufferedReader(new InputStreamReader(System.in)) - эффективен для построчного чтения, быстрее Scanner.

System.console() - возвращает объект Console, позволяющий читать строки и пароли без эха. Работает только в интерактивной консоли, не из IDE.

DataInputStream(System.in) - позволяет читать примитивные типы напрямую, но требует точного формата ввода.

Альтернативы в других языках

PHP: чтение из STDIN

$line = fgets(STDIN);
echo $line;

JavaScript (Node.js):

process.stdin.on('data', chunk => {
    console.log(chunk.toString());
});

Python:

line = input()
print(line)

C#:

string line = Console.ReadLine();
Console.WriteLine(line);

Lua:

line = io.read()
print(line)

Go:

scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
fmt.Println(scanner.Text())

Kotlin:

val line = readLine()
println(line)

Типичные ошибки

1. Закрытие System.in через Scanner.close() приводит к невозможности дальнейшего чтения.

Scanner sc = new Scanner(System.in);
sc.close();
String s = sc.nextLine(); // NoSuchElementException

2. Смешивание nextInt() и nextLine() без учёта перевода строки.

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s = sc.nextLine(); // s - пустая строка

3. Игнорирование IOException при работе с InputStream.

int b = System.in.read(); // требует обработки IOException

4. Попытка использовать System.console() в среде без консоли (IDE) - возвращает null.

Изменения в версиях Java

Java 1.0: System.in присутствует с самого начала.

Java 6: добавлен System.console() для безопасного чтения паролей.

Java 9: в InputStream появился метод readAllBytes(), читающий все данные из потока.

Других существенных изменений в поведении System.in не было.

Расширенные примеры

1. Чтение пароля без эха через Console:

Пример java
Console console = System.console();
if (console != null) {
    char[] password = console.readPassword("Enter password: ");
    System.out.println("Length: " + password.length);
}

2. Перенаправление System.in на файл:

Пример java
System.setIn(new FileInputStream("input.txt"));
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
    System.out.println(sc.nextLine());
}

3. Неблокирующее чтение с таймаутом (с использованием available):

Пример java
BufferedInputStream bis = new BufferedInputStream(System.in);
long start = System.currentTimeMillis();
while (System.currentTimeMillis() - start < 5000) {
    if (bis.available() > 0) {
        byte[] buf = new byte[1024];
        int len = bis.read(buf);
        System.out.println("Read: " + new String(buf, 0, len));
    }
}

4. Чтение всех байтов сразу (Java 9+):

Пример java
byte[] allBytes = System.in.readAllBytes();
System.out.println(new String(allBytes, StandardCharsets.UTF_8));

5. Чтение double через DataInputStream:

Пример java
DataInputStream dis = new DataInputStream(System.in);
double d = dis.readDouble(); // ожидает 8 байт в двоичном формате

джава System.in function comments

En
System.in The standard input stream