Что такое system in что такое system out
Ввод данных с клавиатуры
В 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 буферизует ввод, обеспечивая считывание из потока ввода (клавиатура это или файл – не важно) целых строк, что делает процесс более быстрым.
Выражение BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); есть сокращенная запись от:
В случае Scanner дело обстоит попроще, так как класс может больше:
У сканера есть методы, проверяющие тип вводимых данных (hasNextInt() и т. п.). Несмотря на удобство Scanner, если надо просто считывать строки без их анализа, предпочитают использовать BufferedReader, так как он работает быстрее. В остальном выбор зависит от специфики задачи.
BestProg
Система ввода/вывода Java. Потоки. Байтовые потоки. Символьные потоки. Стандартные потоки
Содержание
Поиск на других ресурсах:
1. Общие понятия системы ввода/вывода Java. Поток. Определение потока
В языке программирования Java ввод/вывод информации базируется на понятии потока. Поток – это абстрактное понятие, которое символизирует источник или приемник данных, который может передавать или получать некоторую информацию. Любой поток скрывает операции над данными, которые выполняются на низших уровнях непосредственно в устройствах ввода/вывода.
Соответственно назначению потоков, классифицируются и классы в языке Java. Одни классы реализуют операции ввода, другие реализуют операции вывода. Чтобы использовать классы потоков ввода/вывода нужно импортировать пакет java.io
Объекты классов Java, которые используются для ввода/вывода, для обеспечения необходимой функциональности наслаиваются друг на друга. Такая модель взаимодействия объектов поддерживается в паттерне «Декоратор». В этом паттерне при создании потока нужно использовать несколько объектов.
2. Виды потоков в Java
В языке Java различают два вида потоков:
Классы, которые реализуют байтовые потоки ввода унаследованы от абстрактного класса InputStream :
Классы, которые реализуют байтовые потоки вывода унаследованы от абстрактного класса OutputStream :
4. Символьные потоки ввода/вывода. Обзор классов символьных потоков
Классы, которые предназначены для описания символьных потоков делятся на два вида:
Классы потоков ввода следующие:
Классы потоков вывода следующие:
Потоки ввода/вывода
1) Потоки делятся по направлению: потоки ввода и потоки вывода
2) Потоки делятся по типу данных: работают с байтами или работают с символами.
Поток ввода | Поток вывода | |
---|---|---|
Работает с байтами | InputStream | OutputStream |
Работает с символами | Reader | Writer |
Если объект реализует интерфейс InputStream, значит, он поддерживает последовательное чтение из него байт (byte).
Если объект реализует интерфейс OutputStream, значит, он поддерживает последовательную запись в него байт (byte).
Если объект реализует интерфейс Reader, значит, он поддерживает последовательное чтение из него символов (char).
Если объект реализует интерфейс Writer, значит, он поддерживает последовательную запись в него символов (char).
Поток вывода напоминает принтер. На принтер мы можем выводить документы. В поток вывода мы можем выводить данные.
Тогда поток ввода можно сравнить со сканером, ну или с розеткой. С помощью сканера мы можем ввести документы к себе в компьютер. Также мы можем подключится к розетке и получать из нее электричество. Из потока ввода мы можем получать данные.
— А где они используются?
— Эти классы используются в Java повсеместно. Известный нам System.in – это статическая переменная по имени in типа InputStream в классе System.
— Надо же! Оказывается, все это время я пользовался потоком InputStream и не знал об этом. System.out – тоже поток?
— Да, System.out – это статическая переменная по имени out типа PrintStream (наследник OutputStream) в классе System.
— Т.е. я все время пользовался потоками и даже не подозревал об этом?
— Да, и это говорит лишь о том, насколько такие потоки удобны. Просто берешь и пользуешься.
— Хотя этого нельзя сказать про System.in. К нему постоянно приходилось добавлять BufferedReader и InputStreamReader.
— Да, это так. Но на это тоже были свои причины.
Видишь ли, типов данных очень много, как и способов работы с ними. Поэтому количество стандартных классов ввода-вывода очень быстро росло, хоть они и делали все почти то же самое. Чтобы избежать такой сложности, разработчики Java применили принцип абстракции и разделили классы на много маленьких частей.
Зато их можно соединить последовательно и получить очень сложную функциональность, если она тебе понадобилась. Смотри пример:
— Действительно, чем-то похоже на конструктор Lego. Только непонятно, что весь этот код делает.
— Пусть это тебя не беспокоит сейчас. Всему свое время.
Хочу, чтобы ты запомнил вот что: если класс реализует интерфейс OutputStream – он позволяет записывать в него байты. Почти так же, как ты выводишь данные на консоль. Что он будет с этими данными делать – его задача. В «конструкторе» важно не назначение отдельного элемента, а насколько классные вещи мы можем собрать, благодаря многообразию существующих элементов.
Ввод с клавиатуры
1. Чтение с консоли, System.in
Но, как вы уже наверное догадываетесь, одного вывода на экран недостаточно. Цель большинства программ — сделать что-то полезное для пользователя. Поэтому очень часто нужно, чтобы пользователь мог вводить данные с клавиатуры.
Поэтому мы воспользуемся еще одним классом, который в паре с объектом System.in даст нам все, что нужно. В Java уже давно есть классы на все случаи жизни. С одним из них мы сейчас и познакомимся.
2. Класс Scanner
Класс Scanner (полное имя java.util.Scanner ) умеет считывать данные из разных источников: консоль, файлы, интернет. Если мы хотим, чтобы он считывал данные с клавиатуры, мы должны передать ему объект System.in в качестве параметра – источника данных. А уж объект типа Scanner сам разберется, что с ним делать.
Считывание с клавиатуры с помощью объекта типа Scanner будет выглядеть примерно так:
Выглядит вроде несложно, но так ли все просто на самом деле?
Думаю, у вас появилась куча вопросов, и сейчас мы на них ответим.
Но для начала продемонстрируем пример полной программы, где используется класс Scanner :
3. Создание объекта Scanner
Такая строка может сбивать с толку, однако вы будете постоянно встречать похожие вещи. Так что, думаем, настало время объяснить, что тут написано.
Вспомним, как мы обычно создаем переменную с текстом:
Сначала мы пишем тип переменной ( String ), затем ее имя ( str ) и, наконец, после знака равно пишем значение.
В нашей странной строке на самом деле все то же самое:
Думаю, теперь все стало гораздо понятнее.
4. Вызов методов
Чтобы вызвать методы объекта, на который ссылается переменная, нужно после имени переменной написать точку, а затем имя метода и параметры. Общий вид этой команды такой:
Если вы не планируете передавать в функцию параметры, нужно писать просто пустые скобки:
5. Ввод данных с консоли
Если пользователь ввел данные, которые невозможно преобразовать в целое число, в программе возникнет ошибка, и она завершится.
Пример программы, которая считывает с клавиатуры два числа и выводит их сумму:
6. Другие методы класса Scanner
Метод | Описание |
---|---|
Считывает данные и преобразует их в тип byte | |
Считывает данные и преобразует их в тип short | |
Считывает данные и преобразует их в тип int | |
Считывает данные и преобразует их в тип long | |
Считывает данные и преобразует их в тип float | |
Считывает данные и преобразует их в тип double | |
Считывает данные и преобразует их в тип boolean | |
Считывает одно «слово». Слова разделяются пробелами или enter | |
Считывает целую строку |
Есть еще методы, которые позволяют проверить тип еще не считанных данных (чтобы знать, каким методом их считывать).
7. Ввод данных из строки
Консольный ввод/вывод, импорт пакетов
Наиболее простой способ взаимодействия с пользователем представляет консоль: мы можем выводить в консоль некоторую информацию или, наоборот, считывать из консоли какие-либо данные.
Рассмотрим их по порядку. Если в программе вызвать два вот таких метода:
то в консоле мы увидим сообщение «Hello World!» в одну строку, без переноса строк, так как метод print не выполняет автоматический перенос на следующую строку. Правда мы можем сделать это самостоятельно, если пропишем символ ‘\n’ – перевода строки после первого слова «Hello»:
В этом случае второе слово будет отображаться на следующей строке. Запомним этот символ переноса строки. Это универсальный символ, который применяется повсюду, а не только в этой функции.
Если же нам нужно вывести сообщение в строку с автоматическим переходом на новую строку, то вместо print следует использовать метод println:
Смотрите, здесь нет символа перевода строки, но слово «World!» все равно отобразилось с новой строки. Вот в этом отличие между print и println.
Далее, с помощью этих функций можно выводить значения переменных, используя такие варианты:
Вот эти плюсы здесь означают соединение двух строк, т.е. в конец первой строки добавляется вторая (либо числовое значение переменной, которое затем будет представлено в виде единой строки).
Наконец, для тех кто знаком с языком С/С++ в Java есть функция printf, которая работает также и служит для форматированного вывода информации в консоль. Синтаксис этого метода такой:
Например, мы можем вывести переменные x и y с помощью этой функции так:
Обратите внимание, когда мы инициализировали переменную z вещественным значением, то в конце поставили букву f. Эта буква определяет вещественное число типом float. Если такая буква отсутствует у вещественного числа, то оно по умолчанию определяется как double.
С выводом данных в целом разобрались. Теперь посмотрим как можно вводить данные с клавиатуры. Для этого в классе System определен объект in. Но через него не очень удобно работать. Поэтому используют другой класс Scanner, который является некой надстройкой над объектом System.in и предоставляет более удобный инструментарий для ввода значений с клавиатуры.
Этот класс определен в пакете java.util, поэтому для доступа к нему следует сначала прописать этот пакет, а затем, указать сам класс:
Но каждый раз вот так прописывать java.util.Scanner не очень то удобно. Поэтому мы сделаем так. Импортируем этот пакет с классом Scanner в нашу программу:
И теперь все можно записать проще:
Далее, мы здесь создаем новый объект Scanner с помощью оператора new и будем работать с этим объектом через ссылку in на него. Позже в других уроках мы еще будем подробнее говорить о создании объектов и ссылках на них. Сейчас просто запомните, что вот так создаются объекты в Java.
Теперь через ссылку in мы можем обращаться к открытым методам объекта Scanner. Например, для ввода целочисленных значений, достаточно записать:
Мы здесь объявляем переменную num и сразу ее инициализируем значением, введенным с клавиатуры. То есть, метод nextInt() объекта Scanner реализует ввод целочисленного значения и, затем, возвращает полученный результат.
Далее, выведем введенное значение в консоль, чтобы убедиться, что все работает:
И после окончания работы с входным потоком, его нужно закрыть:
То есть для ввода значений каждого примитивного типа в классе Scanner определен свой метод. Что очень удобно. Например, напишем такую программу для ввода информации о человеке:
И обратите внимание, когда мы вводим вещественное значение, то мне приходится вводить его через запятую. Если пишется точка, то возникает исключение некорректного ввода данных. Это связано с настройкой языковой локализации на конкретном компьютере. И у вас, возможно, с другой настройкой нужно будет писать точку. Вот такой существует нюанс, который сейчас просто имейте в виду.
Вот так в Java реализуется консольный вывод и ввод информации. И вы теперь знаете как это все работает.
Видео по теме
#1 Установка пакетов и первый запуск программы
#2 Структура программы, переменные, константы, оператор присваивания
#3 Консольный ввод/вывод, импорт пакетов
#4 Арифметические операции
#5 Условные операторы if и switch
#6 Операторы циклов while, for, do while
#7 Массивы, обработка элементов массива
#8 (часть 1) Строки в Java, методы класса String
#9 Битовые операции И, ИЛИ, НЕ, XOR
#10 Методы, их перегрузка и рекурсия
© 2021 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта