Polytech-soft.com

ПК журнал
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java util описание

Изучаем Java

Вы здесь: Главная >> Java-самоучитель >> Пакет Java.util и вопросы

Обучающие курсы:

Пакет Java.util и вопросы

Это один из больших пакетов. В данном пакете содержится одно из новшеств Java 2 — коллекции. Коллекцией называется некоторый набор объектов, объединяемых с целью максимально эффективного их использования. Коллекции — достаточно сложная тема и начинающим она ни к чему, поэтому в этой книге она рассматриваться не будет.
Однако упомянутый пакет имеет набор классов, не относящихся к коллекциям. Ниже приведено описание некоторых таких классов.

Класс Calendar . Этот класс не содержит конструкторов. Есть множество констант, среди них — константы, содержащие текущую дату и время (они, соответственно, обозначаются английскими эквивалентами компонентов— например, DAY, HOUR и др.), названия месяцев (тоже по-английски), еще некоторые константы. Вот несколько методов этого класса:
— after— значение true, если указанный в параметре Calendar-объект более «ранний», чем объект, который этот метод вызвал;
— before — полностью противоположен предыдущему методу;
— clone — копирует объект;
— get — возвращает значение какой-либо константы;
— get Ins tance — возвращает текущую дату в виде Calendar-объекта;
— getTime — преобразует Calendar в Date;
— getTimeZone — преобразует Calendar в TimeZone;
— set — устанавливает значения даты и времени для объекта;
— setTime — преобразует в Calendar Date-объект;
— setTimeZone — преобразует в Calendar TimeZone-объскт.

Класс Date . Имеет два конструктора: первый не имеет параметров и присваивает объекту текущую дату и время, второй устанавливает их с помощью задания в параметре количества миллисекунд, прошедших с 1.1.70. Имеет основные методы after, before, clone, getTime (возвращение миллисекунд) и setTime (установление миллисекунд). О методе toString мы не упоминаем, так как он присутствует почти у всех объектов.

Класс GregorianCalendar . Расширяет класс Calendar. Нужен для установки даты и времени с учетом текущих часовым поясом и регионом. В конструкторах можно указывать дату и время в разных вариациях. Можно также указывать регион и часовой пояс в виде объектов Locale и TimeZone соответственно.

Класс Locale . Нужен для определения языкового региона. Содержит несколько констант с названиями различных стран, например GERMANY и ITALY. В конструкторе можно установить язык и страну. С помощью статического метода setDefault можно установить регион по умолчанию. С помощью метода getDisplayCountry () можно получить название страны, а с помощью метода getDisplayLanguage () — язык.

Класс Random . Отвечает за генерацию случайных чисел. Основные методы:
— nextBoolean — случайное значение типа boolean;
— nextDouble — то же самое для типа данных double;
— nextFloat —то же для типа данных float;
— nextInt — то же для типа данных int;
— nextLong — то же для типа данных long.

Класс TimeZone . Этот класс позволяет установить отклонение от времени по Гринвичу. Есть множество методов этого класса, я приведу лишь три из них:
— getDefault — возвращает заданный по умолчанию часовой пояс;
— getTimeZone — возвращает объект для параметра, в котором указывается
имя часового пояса;
— setDefault — устанавливает задаваемый по умолчанию часовой пояс.

Приведем пример использования упомянутых выше классов (листинг 6.6).

Листинг 6.6.
Пример использования классов пакета java.util

Несколько слов о пакете java.io

В этом разделе я в двух словах расскажу о принципах ввода-вывода в Java.
Ввод-вывод происходит с помощью так называемых потоков, которые могут получать/отдавать информацию.
Ввод-вывод бывает символьным и байтовым. Байтовые потоки используются для операций ввода-вывода с байтами. Символьные потоки предназначены для операций ввода-вывода с символами Unicode.
Обычный консольный ввод-вывод идет через байтовые потоки. Основные абстрактные классы, от которых наследуются все классы байтового ввода-вывода, — Inputstream и OutputStream.
Переменные out и err объекта System являются экземплярами класса OutputStream, переменная in— экземпляром класса inputstream. Мы будем использовать символьный ввод-вывод, основными абстрактными классами которого являются классы Reader и Writer.
Все потоки имеют методы write и read, используемые чаще всего.

Если будете тестировать программы с помощью командной строки (как это сделать — см. главу 7), то столкнетесь с тем, что выполнение программ приводит к тому, что текст на русском языке отображается странными символами. Это происходит потому, что мы используем байтовый ввод-вывод и, соответственно, мы должны применять только английские символы.
Теперь же давайте будем использовать вывод с помощью класса PrintWriter.
Он позволяет выводить русский текст при указании необходимой кодировки в процессе создания необходимого объекта класса OutputStreamWriter (а это уже байтовый ввод-вывод) — в данном случае Ср866.
В конструкторе этого байтового класса мы вначале указываем, какой объект для вывода мы будем использовать, а затем можно указать и кодировку. Вот текст программы, приведенной в конце главы 3, переписанный так, что будет выводиться русский текст (листинг 6.7).

Листинг 6.7.
Вывод данных с помощью класса PrintWriter

Стандартный ввод обычно происходит с помощью класса символьного ввода Buffered- Reader.
В его конструкторе можно указать объект байтового класса inputStreairiReader.
Можно использовать метод read для ввода одного символа и метод readLine — для ввода целой строки. Не надо только забывать преобразовывать тип данных int в тип данных char (при работе с методом read).
Пример программы (листинг 6.8).

Листинг 6.8.
Ввод данных с помощью класса символьного ввода Buffered Reader

Теперь рассмотрим файловый ввод-вывод. Для чтения из файла используют класс FilelnputStream или класс FileReader с методом read. Этот метод читает файл посимвольно, а по достижении конца файла получает значение 1. Обычно для чтения из файла используется цикл do. while.

Для записи в файл используются классы FileWriter и FileOutputStream с методом посимвольной записи write. В параметрах конструкторов у всех этих классов указывается имя и путь файла.

Еще о некоторых пакетах

Кратко остановимся на работе трех других основных пакетов.

• Пакет java. net. Существует для работы в Сети. Поддерживает технологию так называемых сокетов.

• Пакет java. awt. Набор графических компонентов (множество элементов управления); многие из них мы дальше рассмотрим на примерах. Кроме того, есть обширный класс Graphics, который содержит методы drawstring (рисует строку по координатам), drawLine (рисует линию), drawRect (рисует незаполненный прямоугольник) и др.

• Пакет javax. swing. Содержит набор облегченных дополненных новыми возможностями swing-компонентов; мы также рассмотрим его дальше на примере.

Существует еще множество пакетов, например java. applet, — пакет для работы с аплетами. Об этом можно прочесть в справочной литературе и прилагаемой документации, поэтому не буду больше об этом говорить.

Рассмотрение языка Java я на этом заканчиваю. Теперь вы умеете читать и писать Java-программы.

Резюме

1. Пакет — это набор классов для индивидуализации имен классов.
2. Пакет java. lang содержит классы для работы с основными типами данных.
3. Пакет java.util содержит так называемые коллекции, а также несколько классов для работы с датой и временем, случайными числами и т.д.

Вопросы

1. Что такое пакет?
2. Что такое пакет java.util?
3. Что такое пакет java. lang?
4. Что такое пакет java. io?
5. Что такое пакет java. net?
6. Что такое пакет java. awt?
7. Что такое пакет javax. swing?

Контрольные упражнения

1. Создайте свой пакет с одним классом.

Вопросы к части 1.

1. Кто и когда создал язык Java?
2. Из каких компонентов состоит Java-программа?
3. Какие виды данных в Java вы знаете?
4. Что такое конструкции выбора, циклы и инструкции выхода?
5. Что такое класс?
6. Что такое метод?
7. Что такое интерфейс?
8. Что такое исключение?
9. Какие есть теги документирования кода?
10. Что такое многопоточное программирование?
11. Что такое пакеты и какие из них вы знаете?

Сергей Владимирцев
24.02.2011

Читать еще:  Получение данных из формы в javascript

Пакет java.util

Java включает большое количество вспомогательных классов, широко используемых в других встроенных пакетах Java. Эти классы расположены в пакете java.util и используются для работы с набором объектов, взаимодействия с системными функциями низкого уровня, для работы с математическими функциями, генерации случайных чисел и манипуляций с датой и временем :

  • Класс Date имеет два конструктора : первый не имеет параметров и присваивает объекту текущую дату и время, второй устанавливает их с помощью задания в параметре количества миллисекунд, прошедших с 1.1.70. Имеет основные методы after, before, clone, getTime и setTime.
  • Класс Calendar абстрактный, не содержит конструкторов. Существует конкретная реализация этого класса GregorianCalendar. Класс включает множество констант, содержащих текущую дату и время (DAY, HOUR и др.), названия месяцев (в английской аббревиатуре). Вот несколько методов этого класса :
    • clone — копирование объекта;
    • get — получение значения какой-либо константы;
    • getInstance — получение Calendar-объекта;
    • getTime — получение времени;
    • getTimeZone — получение часового пояса;
    • set — определение значения даты и времени для объекта;
    • setTime — определение времени;
    • setTimeZone — определение часового пояса.
  • Класс GregorianCalendar расширяет класс Calendar и используется для установки даты и времени с учетом текущего часового пояса и региона. В конструкторах можно указывать дату и время в разных вариациях. Можно также указывать регион и часовой пояс в виде объектов Locale и TimeZone соответственно.
  • Класс TimeZone позволяет установить отклонение от времени по Гринвичу. Есть множество методов этого класса, вот лишь три из них:
    • getDefault — получение заданного по умолчанию часового пояс;
    • getTimeZone — возвращает объект согласно значению параметра, в котором указывается наименование часового пояса;
    • setDefault — определение задаваемого по умолчанию часового пояса.
  • Интерфейс Collection является основой всей иерархии классов-коллекций и определяет базовую функциональность любой коллекции — набор методов которые позволяют добавлять, удалять, выбирать элементы коллекции. Классы которые имплементируют интерфейс Collection, могут содержать дубликаты и пустые (null) значения. AbstractCollection, являясь абстрактным классом обеспечивает, служит основой для создания конкретных классов коллекций и содержит реализацию некоторых методов определенных в интерфейсе Collection.
  • Интерфейс Set расширяет интерфейс Collection. Классы которые реализуют этот интерфейс не разрешают наличие дубликатов. В коллекции этого типа допускается наличие только одной ссылки типа null. Любой объект добавляемый в Set должен реализовать метод equals для того, что бы его можно было сравнить с другими. AbstractSet являясь абстрактным классом представляет из себя основу для реализации различных вариантов интерфейса Set.
  • Интерфейс List расширяет интерфейс Collection. Классы которые реализуют этот интерфейс содержат упорядоченную последовательность объектов (Объекты хранятся в том порядке в котором они были добавлены). List обеспечивает также ListIterator, который позволяет перемещаться как вперед, так и назад, по элементам списка. AbstractList являясь абстрактным классом представляет из себя основу для реализации различных вариантов интерфейса List.
  • Интерфейс Map не расширяет интерфейс Collection. Классы, реализующие этот интерфейс, хранят неупорядоченный набор объектов парами типа ключ/значение. Каждый ключ должен быть уникальным. Порядок следования пар ключ/значение не определен. AbstractMap являясь абстрактным классом представляет из себя основу для реализации различных вариантов интерфейса Map.
  • Интерфейс SortedSet расширяет Set требуя, чтобы содержимое набора было упорядочено. Объект, имплементирующий SortedSet, содержит объекты, которые реализуют интерфейс Comparator или могут сравниваться с использованием внешнего объекта, реализующего интерфейс Comparator.
  • Интерфейс Iterator. В Java 1 для перебора элементов коллекции использовался интерфейс Enumeration. В Java 2 для этих целей должны использоваться объекты, реализующие интерфейс Iterator. Все классы, которые реализуют интерфейс, Collection, должны реализовать метод iterator, возвращающий объект, реализующий интерфейс Iterator. Iterator имеет сходство с Enumeration, с тем лишь отличием, что в нем определен метод remove, который позволяет удалить объект из коллекции, для которой Iterator бы создан.
  • Класс Properties предназначен для хранения набора свойств (параметров). Методы String getProperty(String key), String getProperty(String key, String defaultValue) позволяют получить свойство из набора. С помощью метода setProperty(String key, String value) это свойство можно установить.
  • Интерфейс Comparator. В коллекциях многие методы сортировки или сравнения требуют передачи в качестве одного из параметров объекта, который реализует интерфейс Comparator. Этот интерфейс определяет единственный метод compare(Object obj1, Object obj2), который, на основании алгоритма определенного пользователем, сравнивает объекты переданные в качестве параметров.
  • Класс Arrays является статическим и обеспечивает набор методов для выполнения таких операций над массивами, как поиск, сортировка, сравнение. В Arrays так же определен статический метод public List aList(a[] data); который возвращает список фиксированного размера основанный на массиве. Изменения в List можно внести изменив данные в массиве. Обратная операция, т.е. представление какой-либо коллекции в виде массива осуществляется с помощью статического метода Object[] toArray() определенного в классе Collections.

    Многопоточное программирование в Java 8. Часть первая. Параллельное выполнение кода с помощью потоков

      Переводы, 8 июля 2015 в 16:58

    Добро пожаловать в первую часть руководства по параллельному программированию в Java 8. В этой части мы на простых примерах рассмотрим, как выполнять код параллельно с помощью потоков, задач и сервисов исполнителей.

    Впервые Concurrency API был представлен вместе с выходом Java 5 и с тех пор постоянно развивался с каждой новой версией Java. Большую часть примеров можно реализовать на более старых версиях, однако в этой статье я собираюсь использовать лямбда-выражения. Если вы все еще не знакомы с нововведениями Java 8, рекомендую посмотреть мое руководство.

    Потоки и задачи

    Все современные операционные системы поддерживают параллельное выполнение кода с помощью процессов и потоков. Процесс — это экземпляр программы, который запускается независимо от остальных. Например, когда вы запускаете программу на Java, ОС создает новый процесс, который работает параллельно другим. Внутри процессов мы можем использовать потоки, тем самым выжав из процессора максимум возможностей.

    Потоки (threads) в Java поддерживаются начиная с JDK 1.0. Прежде чем запустить поток, ему надо предоставить участок кода, который обычно называется «задачей» (task). Это делается через реализацию интерфейса Runnable , у которого есть только один метод без аргументов, возвращающий void — run() . Вот пример того, как это работает:

    Поскольку интерфейс Runnable функциональный, мы можем использовать лямбда-выражения, которые появились в Java 8. В примере мы создаем задачу, которая выводит имя текущего потока на консоль, и запускаем ее сначала в главном потоке, а затем — в отдельном.

    Результат выполнения этого кода может выглядеть так:

    Из-за параллельного выполнения мы не можем сказать, будет наш поток запущен до или после вывода «Done!» на экран. Эта особенность делает параллельное программирование сложной задачей в больших приложениях.

    Sportmaster Lab, Москва

    Потоки могут быть приостановлены на некоторое время. Это весьма полезно, если мы хотим сэмулировать долго выполняющуюся задачу. Например, так:

    Когда вы запустите этот код, вы увидите секундную задержку между выводом первой и второй строки на экран. TimeUnit — полезный класс для работы с единицами времени, но то же самое можно сделать с помощью Thread.sleep(1000) .

    Работать с потоками напрямую неудобно и чревато ошибками. Поэтому в 2004 году в Java 5 добавили Concurrency API. Он находится в пакете java.util.concurrent и содержит большое количество полезных классов и методов для многопоточного программирования. С тех пор Concurrency API непрерывно развивался и развивается.

    Давайте теперь подробнее рассмотрим одну из самых важных частей Concurrency API — сервис исполнителей (executor services).

    Исполнители

    Concurrency API вводит понятие сервиса-исполнителя (ExecutorService) — высокоуровневую замену работе с потоками напрямую. Исполнители выполняют задачи асинхронно и обычно используют пул потоков, так что нам не надо создавать их вручную. Все потоки из пула будут использованы повторно после выполнения задачи, а значит, мы можем создать в приложении столько задач, сколько хотим, используя один исполнитель.

    Вот как будет выглядеть наш первый пример с использованием исполнителя:

    Класс Executors предоставляет удобные методы-фабрики для создания различных сервисов исполнителей. В данном случае мы использовали исполнитель с одним потоком.

    Результат выглядит так же, как в прошлый раз. Но у этого кода есть важное отличие — он никогда не остановится. Работу исполнителей надо завершать явно. Для этого в интерфейсе ExecutorService есть два метода: shutdown() , который ждет завершения запущенных задач, и shutdownNow() , который останавливает исполнитель немедленно.

    Вот как я предпочитаю останавливать исполнителей:

    Исполнитель пытается завершить работу, ожидая завершения запущенных задач в течение определенного времени (5 секунд). По истечении этого времени он останавливается, прерывая все незавершенные задачи.

    Callable и Future

    Кроме Runnable , исполнители могут принимать другой вид задач, который называется Callable . Callable — это также функциональный интерфейс, но, в отличие от Runnable , он может возвращать значение.

    Давайте напишем задачу, которая возвращает целое число после секундной паузы:

    Callable-задачи также могут быть переданы исполнителям. Но как тогда получить результат, который они возвращают? Поскольку метод submit() не ждет завершения задачи, исполнитель не может вернуть результат задачи напрямую. Вместо этого исполнитель возвращает специальный объект Future, у которого мы сможем запросить результат задачи.

    После отправки задачи исполнителю мы сначала проверяем, завершено ли ее выполнение, с помощью метода isDone() . Поскольку задача имеет задержку в одну секунду, прежде чем вернуть число, я более чем уверен, что она еще не завершена.

    Вызов метода get() блокирует поток и ждет завершения задачи, а затем возвращает результат ее выполнения. Теперь future.isDone() вернет true , и мы увидим на консоли следующее:

    Задачи жестко связаны с сервисом исполнителей, и, если вы его остановите, попытка получить результат задачи выбросит исключение:

    Вы, возможно, заметили, что на этот раз мы создаем сервис немного по-другому: с помощью метода newFixedThreadPool(1) , который вернет исполнителя с пулом в один поток. Это эквивалентно вызову метода newSingleThreadExecutor() , однако мы можем изменить количество потоков в пуле.

    Таймауты

    Любой вызов метода future.get() блокирует поток до тех пор, пока задача не будет завершена. В наихудшем случае выполнение задачи не завершится никогда, блокируя ваше приложение. Избежать этого можно, передав таймаут:

    Выполнение этого кода вызовет TimeoutException :

    Вы уже, возможно, догадались, почему было выброшено это исключение: мы указали максимальное время ожидания выполнения задачи в одну секунду, в то время как ее выполнение занимает две.

    InvokeAll

    Исполнители могут принимать список задач на выполнение с помощью метода invokeAll() , который принимает коллекцию callable-задач и возвращает список из Future .

    В этом примере мы использовали функциональные потоки Java 8 для обработки задач, возвращенных методом invokeAll . Мы прошлись по всем задачам и вывели их результат на консоль. Если вы не знакомы с потоками (streams) Java 8, смотрите мое руководство.

    InvokeAny

    Другой способ отдать на выполнение несколько задач — метод invokeAny() . Он работает немного по-другому: вместо возврата Future он блокирует поток до того, как завершится хоть одна задача, и возвращает ее результат.

    Чтобы показать, как работает этот метод, создадим метод, эмулирующий поведение различных задач. Он будет возвращать Callable , который вернет указанную строку после необходимой задержки:

    Используем этот метод, чтобы создать несколько задач с разными строками и задержками от одной до трех секунд. Отправка этих задач исполнителю через метод invokeAny() вернет результат задачи с наименьшей задержкой. В данном случае это «task2»:

    В примере выше использован еще один вид исполнителей, который создается с помощью метода newWorkStealingPool() . Этот метод появился в Java 8 и ведет себя не так, как другие: вместо использования фиксированного количества потоков он создает ForkJoinPool с определенным параллелизмом (parallelism size), по умолчанию равным количеству ядер машины.

    ForkJoinPool впервые появился в Java 7, и мы рассмотрим его подробнее в следующих частях нашего руководства. А теперь давайте посмотрим на исполнители с планировщиком (scheduled executors).

    Исполнители с планировщиком

    Мы уже знаем, как отдать задачу исполнителю и получить ее результат. Для того, чтобы периодически запускать задачу, мы можем использовать пул потоков с планировщиком.

    ScheduledExecutorService способен запускать задачи один или несколько раз с заданным интервалом.

    Этот пример показывает, как заставить исполнитель выполнить задачу через три секунды:

    Когда мы передаем задачу планировщику, он возвращает особый тип Future — ScheduledFuture , который предоставляет метод getDelay() для получения оставшегося до запуска времени.

    У исполнителя с планировщиком есть два метода для установки задач: scheduleAtFixedRate() и scheduleWithFixedDelay() . Первый устанавливает задачи с определенным интервалом, например, в одну секунду:

    Кроме того, он принимает начальную задержку, которая определяет время до первого запуска.

    Обратите внимание, что метод scheduleAtFixedRate() не берет в расчет время выполнения задачи. Так, если вы поставите задачу, которая выполняется две секунды, с интервалом в одну, пул потоков рано или поздно переполнится.

    В этом случае необходимо использовать метод scheduleWithFixedDelay() . Он работает примерно так же, как и предыдущий, но указанный интервал будет отсчитываться от времени завершения предыдущей задачи.

    В этом примере мы ставим задачу с задержкой в одну секунду между окончанием выполнения задачи и началом следующей. Начальной задержки нет, и каждая задача выполняется две секунды. Так, задачи будут запускаться на 0, 3, 6, 9 и т. д. секунде. Как видите, метод scheduleWithFixedDelay() весьма полезен, если мы не можем заранее сказать, сколько будет выполняться задача.

    Это была первая часть серии статей про многопоточное программирование. Настоятельно рекомендую разобрать вышеприведенные примеры самостоятельно. Все они доступны на GitHub. Можете смело форкать репозиторий и добавлять его в избранное.

    Надеюсь, вам понравилась статья. Если у вас возникли какие-либо вопросы, вы можете задать их в твиттере.

    Использование класса Scanner в Java — примеры и методы

    Это руководство по посвящено использованию класса Scanner в Java пакета java.util. Мы будем показывать базовое применение класса Scanner до самых расширенных функций этого класса, используя примеры.

    Класс Scanner имеет богатый набор API, который обычно используется для разбиения входных данных конструктора Scanner на токены. Входные данные разбиваются на токены с помощью разделителя, определенного в классе Scanner с использованием метода radix, или могут быть определены.

    Объявление:
    public final class Scanner
    extends Object
    implements Iterator, Closeable

    Конструкторы класса Scanner — public Scanner(Readable source)

    Создает новый сканер, который создает значения, отсканированные из указанного источника.

    Параметры: source — источник символов, реализующий интерфейс Readable

    Не путайте с типом объекта, доступным для чтения в качестве параметра конструктора. Readable — это интерфейс, который был реализован с помощью BufferedReader, CharArrayReader, CharBuffer, FileReader, FilterReader, InputStreamReader, LineNumberReader, PipedReader, PushbackReader, Reader, StringReader.

    Это означает, что мы можем использовать любой из этих классов в Java при создании экземпляра объекта Scanner.

    public Scanner(InputStream source)

    Создает новый сканер, который создает значения, отсканированные из указанного входного потока. Байты из потока преобразуются в символы с использованием кодировки по умолчанию базовой платформы.

    Параметры: источник — входной поток для сканирования.

    Метод ввода этого конструктора — InputStream. Класс InputStream является одним из классов верхнего уровня в пакете java.io, и его использование будет проблемой.

    Однако мы можем использовать подклассы InputStream, как показано ниже. Мы использовали FileInputStream, поскольку он является подклассом InputStream, при его включении проблем не возникнет.

    public Scanner(File source) выдает исключение FileNotFoundException

    Байты из файла преобразуются в символы с кодировкой по умолчанию базовой платформы.
    Параметры: источник — файл для сканирования

    Этот конструктор очень прост. Просто требует источник файла. Единственной целью этого конструктора является создание экземпляра объекта Scanner для сканирования через файл.

    public Scanner(Path source) throws IOException

    источник — путь к файлу для сканирования. Для параметра конструктора требуется источник Path, который используется редко.

    public Scanner(String source)

    Создает новый сканер, который выдает значения, отсканированные из указанной строки.

    Источник — строка для сканирования.

    Этот конструктор может быть самым простым на практике, поскольку для него требуется только строковый параметр, и он строго используется для сканирования ввода строки.

    Scanner в Java для чтения файлов

    Считать файл очень легко, используя класс Scanner. Нам просто нужно объявить это с помощью конструктора Scanner, например:

    Хитрость в итерации по токену Scanner состоит в том, чтобы применять те методы, которые начинаются с hasNext, hasNextInt и т.д. Давайте сначала остановимся на чтении файла построчно.

    В приведенном выше фрагменте кода мы использовали флаг scan.hasNextLine() как средство проверки наличия токена, который в этом примере доступен на входе сканера. Метод nextLine() возвращает текущий токен и переходит к следующему.

    Комбинации hasNextLine() и nextLine() широко используются для получения всех токенов на входе сканера. После этого мы вызываем метод close(), чтобы закрыть объект и тем самым избежать утечки памяти.

    Считать строку из консоли ввода, используя Scanner Class

    Класс Scanner принимает также InputStream для одного из своих конструкторов. Таким образом, ввод можно сделать с помощью:

    После помещения в наш объект сканера, у нас теперь есть доступ к читаемому и конвертируемому потоку, что означает, что мы можем манипулировать или разбивать входные данные на токены. Используя богатый набор API сканера, мы можем читать токены в зависимости от разделителя, который мы хотим использовать в конкретном типе данных.

    Важные советы

    Недавно я обнаружил одну проблему. Допустим, что мы просим пользователя ввести идентификатор сотрудника и имя сотрудника из консоли.

    После чего мы будем читать ввод с консоли, используя сканер. Идентификатор сотрудника будет читаться с nextInt(), а имя сотрудника будет читаться как nextLine(). Это довольно просто, но это не сработает.

    Приведенный выше пример не будет работать, потому что метод nextInt не читает последний символ новой строки вашего ввода и, следовательно, эта новая строка используется при следующем вызове nextLine.

    Чтобы решить эту проблему, просто используйте next вместо nextline, но если вы хотите указать только nextLine, добавьте еще один scan.nextLine() после nextInt. Посмотрите ниже фрагмент кода:

    Список методов java.util.Scanner

    Ниже приведен список методов java.util.Scanner, которые мы можем использовать для сложного анализа ввода.

    returnметодОписание
    voidclose()Закрывает объект сканера.
    Patterndelimiter()Возвращает шаблон, который объект Scanner в настоящее время использует для сопоставления разделителей.
    StringfindInLine(Pattern pattern)Этот метод возвращает объект String, который удовлетворяет объекту Pattern, указанному в качестве аргумента метода.
    StringfindInLine(String pattern)Пытается найти следующее вхождение шаблона, созданного из указанной строки, игнорируя разделители.
    StringfindWithinHorizon(Pattern pattern, int horizon)Ищет следующее вхождение указанного шаблона.
    StringfindWithinHorizon(String pattern, int horizon)Ищет следующее вхождение шаблона ввода, игнорируя разделитель
    booleanhasNext()Возвращает true, если у этого сканера есть другой токен на входе.
    booleanhasNext(Pattern pattern)Возвращает true, если следующий полный токен соответствует указанному шаблону.
    booleanhasNext(String pattern)Возвращает true, если следующий токен соответствует шаблону, созданному из указанной строки.
    booleanhasNextBigDecimal()Возвращает true, если следующий токен на входе этого сканера можно интерпретировать как BigDecimal с помощью метода nextBigDecimal().
    booleanhasNextBigInteger()Возвращает true, если следующий токен на входе этого сканера может быть интерпретирован как BigInteger, по умолчанию с использованием метода nextBigInteger().
    booleanhasNextBigInteger(int radix)аналогично методу выше, но в указанном основании с помощью метода nextBigInteger()
    booleanhasNextBoolean()проверяет, имеет ли объект логический тип данных в своем буфере.
    booleanhasNextByte()возвращает значение true, если следующий байт в буфере сканера можно преобразовать в тип данных байта, в противном случае — значение false.
    booleanhasNextByte(int radix)true, если следующий токен на входе этого сканера может быть интерпретирован как значение байта в указанном основании с помощью метода nextByte().
    booleanhasNextDouble()true, если следующий токен на входе этого сканера можно интерпретировать как двойное значение с помощью метода nextDouble().
    booleanhasNextFloat()аналогично методу выше, но как значение с плавающей запятой, используя nextFloat().
    booleanhasNextInt()true, если следующий токен на входе этого сканера можно интерпретировать как значение int по умолчанию с помощью метода nextInt().
    booleanhasNextInt(int radix)возвращает логическое значение true, если маркер можно интерпретировать как тип данных int относительно radix, используемого объектом сканера, в противном случае — false.
    booleanhasNextLine()возвращает логический тип данных, который соответствует новой строке String, которую содержит объект Scanner.
    booleanhasNextLong()Возвращает true, если следующий токен на входе этого сканера может быть интерпретирован как длинное значение по умолчанию с использованием метода nextLong().
    booleanhasNextLong(int radix)аналогично методу выше, но в указанном основании с помощью метода nextLong ().
    booleanhasNextShort()как короткое значение с использованием метода nextShort().
    booleanhasNextShort(int radix)возвращает логическое значение true, если маркер можно интерпретировать как короткий тип данных относительно radix, используемого объектом сканера, в противном случае — false.
    IOExceptionioException()Возвращает IOException, последний раз выданный в основе сканера Readable.
    Localelocale()возвращает Locale
    MatchResultmatch()возвращает объект MatchResult, который соответствует результату последней операции с объектом.
    Stringnext()Находит и возвращает следующий полный токен.
    Stringnext(Pattern pattern)Возвращает следующий токен, если он соответствует указанному шаблону.
    Stringnext(String pattern)Возвращает следующий токен, если он соответствует шаблону, созданному из указанной строки.
    BigDecimalnextBigDecimal()Сканирует следующий токен ввода как BigDecimal.
    BigIntegernextBigInteger()как BigInteger.
    BigIntegernextBigInteger(int radix)как BigInteger.
    booleannextBoolean()Сканирует следующий токен ввода как логическое значение и возвращает его.
    bytenextByte()как byte.
    bytenextByte(int radix)как byte.
    doublenextDouble()double.
    floatnextFloat()float.
    intnextInt()int.
    intnextInt(int radix)int.
    StringnextLine()Перемещает сканер за текущую строку и возвращает пропущенный ввод.
    longnextLong()long.
    longnextLong(int radix)long.
    shortnextShort()short.
    shortnextShort(int radix)short.
    intradix()Возвращает основание сканера по умолчанию.
    voidremove()Операция удаления не поддерживается данной реализацией Iterator.
    Scannerreset()Сбрасывает
    Scannerskip(Pattern pattern)Пропускает ввод, соответствующий указанному шаблону, игнорируя разделители.
    Scannerskip(String pattern)Пропускает ввод, соответствующий шаблону, созданному из указанной строки.
    StringtoString()Возвращает строковое представление
    ScanneruseDelimiter(Pattern pattern)Устанавливает шаблон ограничения этого сканера в указанный шаблон.
    ScanneruseDelimiter(String pattern)как метод выше, но созданный из указанной строки.
    ScanneruseLocale(Locale locale)устанавливает local в указанный local.
    ScanneruseRadix(int radix)Устанавливает radix равным указанному.

    Средняя оценка / 5. Количество голосов:

    Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Ссылка на основную публикацию
Adblock
detector