No Image

Считывание символов в java

СОДЕРЖАНИЕ
509 просмотров
10 марта 2020

Я привык к getchar() стиле c, но, похоже, нет ничего похожего на java. Я строю лексический анализатор, и мне нужно читать вводимые символы за символом.

Я знаю, что могу использовать сканер, чтобы сканировать токен или строку и анализировать токен char-by-char, но это кажется громоздким для строк, охватывающих несколько строк. Есть ли способ просто получить следующий символ из входного буфера в Java, или мне просто подключить класс Scanner?

Ввод – это файл, а не клавиатура.

Используйте Reader.read () . Возвращаемое значение -1 означает конец потока; еще, приведи к чар .

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

Плохая вещь в приведенном выше коде заключается в том, что он использует системный набор символов по умолчанию. Везде, где возможно, предпочитайте известную кодировку (в идеале, кодировку Unicode, если у вас есть выбор). Смотрите класс Charset для получения дополнительной информации. (Если вы чувствуете себя мазохистом, вы можете прочитать это руководство по кодированию символов .)

(Одна вещь, которую вы, возможно, захотите посмотреть, это дополнительные символы Юникода – те, которые требуют двух значений char для хранения. См. Класс Character для более подробной информации; это крайний случай, который, вероятно, не будет применяться к домашней работе.)

Наиболее простой способ ввзаимодействия с пользователем представляет консоль: мы можем выводить на консоль некоторую информацию или, наоборот, считывать с консоли некоторые данные. Для взаимодействия с консолью в Java применяется класс System , а его функциональность собственно обеспечивает консольный ввод и вывод.

Вывод на консоль

Для создания потока вывода в класс System определен объект out . В этом объекте определен метод println , который позволяет вывести на консоль некоторое значение с последующим переводом консоли на следующую строку. Например:

В метод println передается любое значение, как правило, строка, которое надо вывести на консоль. И в данном случае мы получим следующий вывод:

При необходимости можно и не переводить курсор на следующую строку. В этом случае можно использовать метод System.out.print() , который аналогичен println за тем исключением, что не осуществляет перевода на следующую строку.

Консольный вывод данной программы:

Но с помощью метода System.out.print также можно осуществить перевод каретки на следующую строку. Для этого надо использовать escape-последовательность
:

Читайте также:  Datamax инструкция на русском

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

Консольный вывод программы:

Но в Java есть также функция для форматированного вывода, унаследованная от языка С: System.out.printf() . С ее помощью мы можем переписать предыдущий пример следующим образом:

В данном случае символы %d обозначают спецификатор, вместо которого подставляет один из аргументов. Спецификаторов и соответствующих им аргументов может быть множество. В данном случае у нас только два аргумента, поэтому вместо первого %d подставляет значение переменной x, а вместо второго – значение переменной y. Сама буква d означает, что данный спецификатор будет использоваться для вывода целочисленных значений.

Кроме спецификатора %d мы можем использовать еще ряд спецификаторов для других типов данных:

%x : для вывода шестнадцатеричных чисел

%f : для вывода чисел с плавающей точкой

%e : для вывода чисел в экспоненциальной форме, например, 1.3e+01

%c : для вывода одиночного символа

%s : для вывода строковых значений

При выводе чисел с плавающей точкой мы можем указать количество знаков после запятой, для этого используем спецификатор на %.2f , где .2 указывает, что после запятой будет два знака. В итоге мы получим следующий вывод:

Ввод с консоли

Для получения ввода с консоли в классе 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

Читайте также:  Посудомоечная машина bosch обозначения на панели

nextDouble() : считывает введенное число double

nextBoolean() : считывает значение boolean

nextByte() : считывает введенное число byte

nextFloat() : считывает введенное число float

nextShort() : считывает введенное число short

То есть для ввода значений каждого примитивного типа в классе Scanner определен свой метод.

Например, создадим программу для ввода информации о человеке:

Здесь последовательно вводятся данные типов String, int, float и потом все введенные данные вместе выводятся на консоль. Пример работы программы:

Обратите внимание для ввода значения типа float (то же самое относится к типу double) применяется число "1,7", где разделителем является запятая, а не "1.7", где разделителем является точка. В данном случае все зависит от текущей языковой локализации системы. В моем случае русскоязычная локализация, соответственно вводить необходимо числа, где разделителем является запятая. То же самое касается многих других локализаций, например, немецкой, французской и т.д., где применяется запятая.

36 jergason [2009-05-01 18:22:00]

Я привык к c-style getchar() , но похоже, что ничего не сопоставимо для java. Я создаю лексический анализатор, и мне нужно прочитать входной символ по символу.

Я знаю, что я могу использовать сканер для сканирования в токене или строке и анализировать через токен char -by- char, но это кажется громоздким для строк, охватывающих несколько строк. Есть ли способ просто получить следующий символ из входного буфера в Java, или я должен просто подключиться к классу Scanner?

Ввод – это файл, а не клавиатура.

java tokenize character

8 ответов

51 Решение McDowell [2009-05-01 18:25:00]

Используйте Reader.read(). Возвращаемое значение -1 означает конец потока; else, отбрасывается на char.

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

Плохая вещь, связанная с приведенным выше кодом, заключается в том, что он использует набор символов по умолчанию для системы. По возможности предпочитайте известную кодировку (в идеале, кодировку Unicode, если у вас есть выбор). Дополнительную информацию смотрите в разделе Charset. (Если вы чувствуете мазохистство, вы можете прочитать это руководство по кодировке символов.)

(Одна вещь, которую вы, возможно, захотите посмотреть, – это дополнительные символы Unicode – те, для которых требуются два значения char для хранения. См. Character для более подробной информации, это краевой случай, который, вероятно, не будет применяться к домашнему заданию.)

Читайте также:  Как из повер поинта сделать ворд

13 roryparle [2009-05-01 19:32:00]

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

Предполагая, что у вас есть объект File , представляющий файл, который вы хотите прочитать:

6 pfranza [2009-05-01 19:00:00]

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

5 David [2009-05-01 21:32:00]

Другой вариант – не читать вещи в символе по символу – прочитать весь файл в памяти. Это полезно, если вам нужно смотреть на символы более одного раза. Один простой способ сделать это:

2 W. B. Reed [2012-08-13 03:42:00]

Если бы я был вами, я бы просто использовал сканер и использовал ".nextByte()". Вы можете применить это к char, и вы хороши.

1 James [2009-05-01 18:38:00]

Оберните читателя в BufferedReader, который поддерживает буфер, позволяющий намного быстрее читать в целом. Затем вы можете использовать read() для чтения одного символа (который вам нужно будет делать). Вы также можете использовать readLine() для извлечения всей строки, а затем разбить ее на отдельные символы. BufferedReader также поддерживает маркировку и возврат, поэтому, если вам нужно, вы можете читать строку несколько раз.

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

1 shake [2009-05-01 18:30:00]

У вас есть несколько вариантов, если вы используете BufferedReader . Этот буферизованный считыватель работает быстрее, чем Reader, поэтому вы можете его обернуть.

это считывает строку в массив char. У вас есть аналогичные варианты. Посмотрите документацию.

В java добавлена ​​5 новых функций, которые представляют собой метод Scanner, который дает возможность читать входной символ по символу в java.

например; для использования Метод сканера import java.util.Scanner; после основного метода: define

Сканер myScanner = новый сканер (System.in); // для символа чтения

char ничего = myScanner.findInLine( "." ). charAt (0);

у вас что-нибудь хранят одиночный символ, если вы хотите больше читать больше символа, объявите больше объекта, как ничего, ничего. еще один пример для вашего ответа, пожалуйста, проверьте свою руку (скопируйте/вставьте)

Комментировать
509 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
Adblock
detector