System.in: примеры (JAVA)
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(); // NoSuchElementException2. Смешивание 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(); // требует обработки IOException4. Попытка использовать System.console() в среде без консоли (IDE) - возвращает null.
Изменения в версиях Java
Java 1.0: System.in присутствует с самого начала.
Java 6: добавлен System.console() для безопасного чтения паролей.
Java 9: в InputStream появился метод readAllBytes(), читающий все данные из потока.
Других существенных изменений в поведении System.in не было.
Расширенные примеры
1. Чтение пароля без эха через Console:
Console console = System.console();
if (console != null) {
char[] password = console.readPassword("Enter password: ");
System.out.println("Length: " + password.length);
}2. Перенаправление System.in на файл:
System.setIn(new FileInputStream("input.txt"));
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}3. Неблокирующее чтение с таймаутом (с использованием available):
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+):
byte[] allBytes = System.in.readAllBytes();
System.out.println(new String(allBytes, StandardCharsets.UTF_8));5. Чтение double через DataInputStream:
DataInputStream dis = new DataInputStream(System.in);
double d = dis.readDouble(); // ожидает 8 байт в двоичном формате