Как ввести имя файла с консоли в java
Обновлено: 07.07.2024
При работе с приложениями или сайтами, пользователям необходимо вводить свои данные: почту, пароль, день рождения и так далее. В Java применяются несколько способов ввода данных с клавиатуры: c помощью метода readLine() класса BufferedReader или метода nextLine() класса Scanner. Разберем подробнее, как работают эти методы.
Метод readLine()
BufferedReader readLine() применяется для чтения одной строки текста, который пользователь ввел с консоли. Конец строки в коде может быть указан как Enter, так и \n , \r или EOF — end of file.
BufferedReader readLIne() работает только со строками в коде. А метод Scanner nextLine() считывает и другие типы данных, например, int, long, double, float.
BufferedReader работает немного быстрее по сравнению со Scanner, потому что nextLine() анализирует данные, а readLine() просто считывает последовательность символов.
Так работает readLine():
И на экран, соответственно, выводится:
Метод nextLine()
NextLine() в Java применяется для класса Scanner. Этот метод так же, как и readLine(), нужен для получения и чтения данных, написанных пользователем. Чтобы применить nextLine(), в коде нужно прописать объект Scanner.
Этот метод читает и воспроизводит данные до конца строки. Другими словами, он может считывать информацию до тех пор, пока не начнется новая строка или старая не будет разорвана с помощью \n или Enter.
Вот как nextLine() работает в Java:
Что пишет пользователь:
Что показывает программа:
Метод nextLine работает с данными только одной строки, поэтому остальное стихотворение теряется из-за разрыва между предложениями и перехода на новую строчку.
Чтобы показать стих полностью, нужно написать следующий код:
Классы-обертки в Java
Класс-обертка — это класс, объект которого содержит примитивные типы данных. Когда мы создаем объект для класса-обертки, он содержит поле, в котором мы можем хранить примитивные типы данных.
Как работают классы-обертки:
- Они преобразуют примитивные типы данных в объекты. Это необходимо, когда мы хотим изменить аргументы, передаваемые через метод (поскольку примитивные типы передаются только через value).
- В пакете java.util классы могут обрабатывать только объекты, и в этом случае помогут обертки.
- Чтобы работать в коллекциях ArrayList и Vector, потребуются объекты, а не примитивные типы.
- Классы-обертки необходимы для поддержки синхронизации в режиме многопоточности.
В коде процесс создания классов-оберток выглядят так:
А если нужно совершить обратный процесс и преобразовать класс-обертку в примитивный тип, то придется совершить unboxing или распаковку данных:
Highload нужны авторы технических текстов. Вы наш человек, если разбираетесь в разработке, знаете языки программирования и умеете просто писать о сложном!
Откликнуться на вакансию можно здесь .
В предыдущих лекциях мы познакомились с командами вывода на экран. Для этого мы использовали объект System.out , и его методы print() и println() . Просто и удобно.
Но, как вы уже наверное догадываетесь, одного вывода на экран недостаточно. Цель большинства программ — сделать что-то полезное для пользователя. Поэтому очень часто нужно, чтобы пользователь мог вводить данные с клавиатуры.
Как и для вывода, для ввода данных тоже есть специальный объект — System.in . Но, к сожалению для нас, он не настолько удобен, как нам бы хотелось. Этот объект позволяет считывать данные с клавиатуры по одному символу за раз.
Поэтому мы воспользуемся еще одним классом, который в паре с объектом System.in даст нам все, что нужно. В Java уже давно есть классы на все случаи жизни. С одним из них мы сейчас и познакомимся.
2. Класс Scanner
Считывание с клавиатуры с помощью объекта типа Scanner будет выглядеть примерно так:
Код | Пояснение |
---|---|
Создаем объект класса Scanner . Читаем с клавиатуры строку текста . Читаем с клавиатуры число . |
Выглядит вроде несложно, но так ли все просто на самом деле?
Думаю, у вас появилась куча вопросов, и сейчас мы на них ответим.
Но для начала продемонстрируем пример полной программы, где используется класс Scanner :
3. Создание объекта Scanner
Такая строка может сбивать с толку, однако вы будете постоянно встречать похожие вещи. Так что, думаем, настало время объяснить, что тут написано.
Вспомним, как мы обычно создаем переменную с текстом:
Сначала мы пишем тип переменной ( String ), затем ее имя ( str ) и, наконец, после знака равно пишем значение.
В нашей странной строке на самом деле все то же самое:
Объявление и инициализация переменной типа ScannerВсе, что находится слева от знака равно — это объявление переменной типа Scanner по имени console . Можно было назвать ее, например, s или scanner , или даже keyboard . Тогда код выглядел бы так:
Думаю, теперь все стало гораздо понятнее.
А код, что находится справа от знака равно , немного сложнее. Имеется в виду new Scanner(System.in); Но тут тоже ничего космического.
В этом коде мы говорим Java-машине: создай новый объект (слово new ) типа Scanner и передай в него в качестве параметра то, из чего новосозданный объект Scanner будет брать данные — объект System.in .
После выполнения всей этой строки у нас появится переменная по имени console типа Scanner , с помощью которой наша программа сможет считывать данные с клавиатуры.
4. Вызов методов
В приведенном выше примере наша переменная console типа Scanner хранила у себя внутри ссылку на объект типа Scanner .
Чтобы вызвать методы объекта, на который ссылается переменная, нужно после имени переменной написать точку, а затем имя метода и параметры. Общий вид этой команды такой:
Вызов метода объекта, на который ссылается переменнаяЕсли вы не планируете передавать в функцию параметры, нужно писать просто пустые скобки:
5. Ввод данных с консоли
Вводить данные с клавиатуры, когда у нас есть объект типа Scanner , очень легко.
Чтобы считать с клавиатуры строку , нужна команда:
Когда программа дойдет до выполнения этой строки, она приостановится и будет ждать, пока пользователь введет данные и нажмет клавишу enter. После этого все, что ввел пользователь, будет сохранено в переменную str .
Чтобы считать с клавиатуры число , нужна команда:
Тут все аналогично предыдущей команде. Когда программа дойдет до выполнения этой строки, она приостановится и будет ждать, пока пользователь введет данные и нажмет клавишу enter. После этого все, что ввел пользователь, будет преобразовано в число и сохранено в переменную number .
Если пользователь ввел данные, которые невозможно преобразовать в целое число, в программе возникнет ошибка, и она завершится.
Чтобы считать с клавиатуры дробное число , нужна команда:
Эта команда полностью аналогична команде nextInt() , только она проверяет, что введенные данные можно преобразовать в число double .
Пример программы, которая считывает с клавиатуры два числа и выводит их сумму:
Пользователь может ввести несколько чисел в одной строке, разделив их пробелами: такая ситуация будет корректно обработана методами класса Scanner . Однако числа будут считаны программой только после того, как пользователь нажмет Enter .
Считай с клавиатуры три строки. А затем: 1. Выведи на экран третью строку в неизменном виде. 2. Выведи на экран вторую строку, предварительно преобразовав ее к верхнему регистру. 3. Выведи на экран первую строку, предварительно преобразовав ее к нижнему регистру. Пример ввода: Строка Номер РАЗ Втор Считай с клавиатуры три целых числа. Выведи на экран их среднее арифметическое. Пример ввода: 50 101 201 Пример вывода: 117 Среднее арифметическое - это число, равное сумме всех чисел, деленной на их количество. Используй деление без остатка.6. Другие методы класса Scanner
Это, кстати, были не все методы класса Scanner . Полный список будет выглядеть примерно так:
Метод | Описание |
---|---|
Считывает данные и преобразует их в тип byte | |
Считывает данные и преобразует их в тип short | |
Считывает данные и преобразует их в тип int | |
Считывает данные и преобразует их в тип long | |
Считывает данные и преобразует их в тип float | |
Считывает данные и преобразует их в тип double | |
Считывает данные и преобразует их в тип boolean | |
Считывает одно «слово». Слова разделяются пробелами или enter | |
Считывает целую строку |
Есть еще методы, которые позволяют проверить тип еще не считанных данных (чтобы знать, каким методом их считывать).
Метод | Описание |
---|---|
Там тип byte ? Его можно будет преобразовать к byte ? | |
Там тип short ? Его можно будет преобразовать к short ? | |
Там тип int ? Его можно будет преобразовать к int ? | |
Там тип long ? Его можно будет преобразовать к long ? | |
Там тип float ? Его можно будет преобразовать к float ? | |
Там тип double ? Его можно будет преобразовать к double ? | |
Там тип boolean ? Его можно будет преобразовать к boolean ? | |
Там есть еще одно слово? | |
Там есть еще одна строка? |
7. Ввод данных из строки
Мы уже говорили выше, что класс Scanner умеет считывать данные из разных источников. И один из этих источников — строка текста .
Вывод на консоль
Для создания потока вывода в класс System определен объект out . В этом объекте определен метод println , который позволяет вывести на консоль некоторое значение с последующим переводом консоли на следующую строку:
В метод println передается любое значение, как правило, строка, которое надо вывести на консоль. При необходимости можно и не переводить курсор на следующую строку. В этом случае можно использовать метод System.out.print() , который аналогичен println за тем исключением, что не осуществляет перевода на следующую строку.
Но с помощью метода System.out.print также можно осуществить перевод каретки на следующую строку. Для этого надо использовать escape-последовательность \n :
Если у нас есть два числа, и мы хотим вывести их значения на экран, то мы можем, например, написать так:
Кроме спецификатора %d мы можем использовать еще ряд спецификаторов для других типов данных:
- %x : для вывода шестнадцатеричных чисел
- %f : для вывода чисел с плавающей точкой
- %e : для вывода чисел в экспоненциальной форме, например, 1.3e+01
- %c : для вывода одиночного символа
- %s : для вывода строковых значений
При выводе чисел с плавающей точкой мы можем указать количество знаков после запятой, для этого используем спецификатор на %.2f , где .2 указывает, что после запятой будет два знака. В итоге мы получим следующий вывод:
Имя: Иван Возраст: 30 лет Рост: 1,70 метров
Консольный ввод
Для получения консольного ввода в классе System определен объект in . Однако непосредственно через объект System.in не очень удобно работать, поэтому, как правило, используют класс Scanner , который, в свою очередь использует System.in. Например, создадим маленькую программу, которая осуществляет ввод чисел:
Так как класс Scanner находится в пакете java.util, то мы вначале его импортируем. Для создания самого объекта Scanner в его конструктор передается объект System.in . После этого мы можем получать вводимые значения. Например, чтобы получить введенное число, используется метод in.nextInt(); , который возвращает введенное с клавиатуры целочисленное значение.
В данном случае в цикле вводятся все элементы массива, а с помощью другого цикла все ранее введенные элементы массива выводятся в строчку.
Класс Scanner имеет еще ряд методов, которые позволяют получить введенные пользователем значения:
- next() : считывает введенную строку до первого пробела
- nextLine() : считывает всю введенную строку
- nextInt() : считывает введенное число int
- nextDouble() : считывает введенное число double
- hasNext() : проверяет, было ли введено слово
- hasNextInt() : проверяет, было ли введено число int
- hasNextDouble() : проверяет, было ли введено double
Кроме того, класс Scanner имеет еще ряд методов nextByte/nextShort/nextFloat/nextBoolean, которые по аналогии с nextInt считывают данные определенного типа данных.
Консоль (console) в Java обеспечивает простое и удобное взаимодействия с пользователем. С помощью консоли можно выводить какую-нибудь информацию либо, напротив, используя консоль, считывать данные. В этой статье будет рассказано о том, как осуществляется ввод и вывод данных в консоли Java.
Чтобы обеспечивать взаимодействие с консолью, в языке программирования Java используют класс System.
Вывод на консоль в Java
Чтобы создать потока вывода в вышеупомянутый класс System, вам понадобится специальный объект out. В нём определен метод println, обеспечивающий вывод значения на консоль и перевод курсора консоли на другую строку.
Рассмотрим практический пример с Hello world:
Что здесь происходит? В метод println осуществляется передача значения (в нашем случае это строка), которое пользователь желает вывести в консоль Java. Консольный вывод данных в Джава будет следующий:
Выполнять перевод строки не обязательно. Если необходимость в этом отсутствует, применяют метод System.out.print() . Он аналогичен println, но перевод каретки на следующую строку не выполняется.
Вывод в консоли Java:
Однако никто не мешает, используя System.out.print, всё же выполнить перенос на следующую строку. Как вариант — использование \n:
Также есть возможность подставить в строку Ява данные, которые объявлены в переменных. Вот, как это реализуется:
В консоли увидим:
Ещё в Java существует функция, предназначенная для форматирования вывода в консоли, — System.out.printf() . При использовании со спецификаторами, она позволяет добиться нужного формата вывода.
Спецификаторы: • %d — для вывода в консоль целочисленных значений; • %x — для 16-ричных чисел; • %f — выводятся числа с плавающей точкой; • %e — для чисел в экспоненциальной форме (1.3e+01); • %c — вывод в консоль одиночного символа; • %s — вывод в консоль строковых значений.
Рассмотрим, как это функционирует на практике:
Когда осуществляется вывод в консоль Java значений с плавающей точкой, есть возможность задать количество знаков после запятой. Спецификатор %.2f (точнее, «.2») определяет, что будет 2 знака после запятой. Вывод в консоль Java будет следующим:
Ввод с консоли Java или как ввести данные с консоли Джавы
Чтобы обеспечить ввод с консоли Java, в классе System есть объект in. Именно через объект System.in работать не очень удобно, поэтому часто применяют класс Scanner. Он уже, в свою очередь, как раз таки и применяет System.in.
Рассмотрим практический пример:
Сам по себе класс Scanner хранится в пакете java.util, поэтому в начале кода мы выполняем его импорт посредством команды import java.util.Scanner.
Для создания непосредственно объекта Scanner в его конструктор осуществляется передача объекта System.in. Далее можно получать значения. В нашей мини-программе сначала выводится просьба ввести номер, а потом введённое пользователем число помещается в переменную num (для получения введённого значения задействуется метод in.nextInt() , возвращающий набранное на клавиатуре целочисленное значение.
Лучше всего попробовать работу этой программы с помощью одного из многочисленных онлайн-компиляторов.
Для класса Scanner предусмотрены и другие методы: • next() — для считывания введённой строки до первого пробела; • nextLine() — для всей введённой строки; • nextInt() — считывает введённое число int; • nextDouble() — для double; • nextBoolean() — для boolean; • nextByte() — для byte; • nextFloat() — для float; • nextShort() — для short.
Давайте напишем простую программу, обеспечивающую ввод информационных данных о человеке в консоль Java:
В этой программке пользователь последовательно вводит данные разных типов: String, int и float. Потом вся информация выводится в консоль Java:
Вот и всё. Это базовые вещи, если же вас интересуют более продвинутые знания, записывайтесь на курс OTUS в Москве:
Работа с консолью в Java. Классы InputStreamReader , PrintStream . Создание потока ввода/вывода связанного с консолью. Перенаправление потоков ввода/вывода в файл, из файла, из строки. Примеры
Содержание
- 1. Создание потока ввода, связанного с консолью. Класс InputStreamReader
- 2. Создание потока вывода, связанного с консолью. Класс PrintStream . Методы print() , println() . Пример
- 3. Класс InputStreamReader . Чтение символов из консоли с помощью метода read() . Примеры
- 4. Чтение символов из консоли с буферизацией. Классы InputStreamReader , BufferedStreamReader . Пример
- 5. Запись данных, выводимых на консоль. Вывод массива вещественных чисел в консоль. Класс PrintStream . Пример
- 6. Чтение строк из консоли с поддержкой буферизации и вывод их на экран. Классы InputStreamReader , BufferedStreamReader . Метод readLine() . Пример
- 7. Чтение строк из консоли и запись их в файл. Классы InputStreamReader , BufferedReader , FileInputStream , PrintStream . Пример
- 8. Чтение строк из символьного файла и вывод их на консоль. Класс FileReader . Пример
- 9. Классы PrintStream , FileOutputStream . Перенаправление потока вывода из строки String в файл. Пример
Поиск на других ресурсах:
1. Создание потока ввода, связанного с консолью. Класс InputStreamReader
Поток ввода данных из консоли можно организовать одним из двух способов:
- с помощью потока ввода байтов;
- с помощью потока ввода символов. В этом случае данные, которые вводятся из консоли, считываются из стандартного потока ввода, которому соответствует переменная System.in из пакета java.lang . Иными словами, переменная System.in ссылается на стандартный поток ввода, которым, по умолчанию, считается клавиатура.
В языке Java для реализации операций ввода из консоли используется класс InputStreamReader . Этот класс есть подклассом абстрактного базового класса Reader и предназначен для конвертирования байт в символы.
Чтобы получить объект типа InputStreamReader нужно создать экземпляр этого типа по следующей общей форме
- objStream – экземпляр, который связан с потоком ввода символов;
- inputStream – поток ввода символов. В случае с консолью, этим потоком выступает переменная System.in .
Значит, для потока System.in , чтобы создать экземпляр (объект) типа InputStreamReader , нужно вызвать следующий конструктор
2. Создание потока вывода, связанного с консолью. Класс PrintStream . Методы print() , println() . Пример
В пакете java.lang реализованы две переменные, которые связаны с потоком записи данных на консоль:
- System.out . Эта переменная соответствует потоку вывода на консоль;
- System.err . Эта переменная связана с потоком вывода ошибок.
Для работы с выводом на консоль разработан специальный класс PrintStream , который есть производным от класса OutputStream . В этом классе основными являются методы print() и println() .
Чтобы создать поток вывода, связанный с консолью, нужно объявить экземпляр класса PrintStream . При создании экземпляра нужно связать его с соответствующим потоком как показано в следующем примере
Результат выполнения программы
3. Класс InputStreamReader . Чтение символов из консоли с помощью метода read() . Примеры
Как известно, с консолью связана стандартная переменная System.in . Чтобы прочитать символы из консоли без буферизации можно использовать возможности класса InputStreamReader . Класс InputStreamReader есть подклассом абстрактного класса Reader . Класс InputStreamReader предназначен для конвертирования байт в символы.
Основным методом класса InputStreamReader есть метод read() , который имеет две перегруженные реализации. Первая реализация имеет следующую общую форму
В этом случае метод возвращает код введенного символа из консоли.
Общая форма второй реализации метода следующая
Здесь метод заполняет массив ac типа char[] введенными значениями символов из консоли. Параметр count задает количество символов, которые нужно вставить в массив ac . Для массива ac предварительно может быть выделена память. Второй вариант метода возвращает количество символов, которые могут быть прочитаны.
Пример 2. Использование метода read() , который обрабатывает массив типа char[] .
- поток_чтения_введенных_данных – некоторый поток данных (файл, консоль и т.п.). В случае консоли здесь задается экземпляр класса InputStreamReader (смотрите предыдущий пункт).
Такой подход реализует паттерн Декоратор (Decorator). В паттерне Декоратор экземпляр одного класса служит оболочкой для экземпляра другого класса. Таким образом происходит наслаивание объектов.
Ниже приведен пример функции ReadConsoleBuf() , которая реализует чтение символов из консоли с буферизацией.
5. Запись данных, выводимых на консоль. Вывод массива вещественных чисел в консоль. Класс PrintStream . Пример
Пример есть демонстрационным. Вывод происходит в экземпляр класса PrintStream , который связан с консолью (переменной System.out ).
6. Чтение строк из консоли с поддержкой буферизации и вывод их на экран. Классы InputStreamReader , BufferedStreamReader . Метод readLine() . Пример
Читать строки из консоли можно используя буферизацию или без нее. Если используется механизм буферизации, то класс InputStreamReader помещается в конструктор класса BufferedReader .
Чтение одной строки осуществляется с помощью функции readLine() .
Результат выполнения программы:
7. Чтение строк из консоли и запись их в файл. Классы InputStreamReader , BufferedReader , FileInputStream , PrintStream . Пример
В примере продемонстрировано перенаправление ввода с консоли в текстовый файл.
Результат выполнения программы:
8. Чтение строк из символьного файла и вывод их на консоль. Класс FileReader . Пример
Пусть задан символьный (текстовый) файл, который нужно вывести на консоль. Чтение строк из файла можно реализовать с помощью метода read() класса FileReader . Строка из файла читается в заведомо выделенный участок памяти – буфер.
Чтобы определить конец файла нужно использовать метод ready() класса FileReader . Если конец файла, то метод возвращает false .
9. Классы PrintStream , FileOutputStream . Перенаправление потока вывода из строки String в файл. Пример
Пусть задана некоторая строка типа String . Нужно записать эту строку в файл путем использования перенаправления потока вывода в файл.
Чтобы реализовать запись строки в файл нужно выполнить следующие действия:
- создать экземпляр класса FileOutputStream с именем файла, в который будет осуществляться запись строки;
- создать экземпляр класса PrintStream , в конструктор которого поместить созданный экземпляр класса FileOutputStream ;
- использовать один из методов print() или println() для записи строки в файл.
Фрагмент программного кода, осуществляющего перенаправление потока вывода из строки в файл, следующий
По данному примеру можно реализовать функцию, которая записывает массив строк в файл.
Читайте также: