Как читать ввод по-символам в Java?

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

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

Вход представляет собой файл, а не клавиатуру.

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

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

 public class CharacterHandler { //Java 7 source level public static void main(String[] args) throws IOException { // replace this with a known encoding if possible Charset encoding = Charset.defaultCharset(); for (String filename : args) { File file = new File(filename); handleFile(file, encoding); } } private static void handleFile(File file, Charset encoding) throws IOException { try (InputStream in = new FileInputStream(file); Reader reader = new InputStreamReader(in, encoding); // buffer for efficiency Reader buffer = new BufferedReader(reader)) { handleCharacters(buffer); } } private static void handleCharacters(Reader reader) throws IOException { int r; while ((r = reader.read()) != -1) { char ch = (char) r; System.out.println("Do something with " + ch); } } } 

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

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

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

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

 BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream(file), Charset.forName("UTF-8"))); int c; while((c = reader.read()) != -1) { char character = (char) c; // Do something with your character } 

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

  /** Read the contents of a file into a string buffer */ public static void readFile(File file, StringBuffer buf) throws IOException { FileReader fr = null; try { fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); char[] cbuf = new char[(int) file.length()]; br.read(cbuf); buf.append(cbuf); br.close(); } finally { if (fr != null) { fr.close(); } } } 

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

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Reader { public static void main(String[] args) throws IOException { BufferedReader buffer = new BufferedReader( new InputStreamReader(System.in)); int c = 0; while((c = buffer.read()) != -1) { char character = (char) c; System.out.println(character); } } } 

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

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

 BufferedReader reader = new BufferedReader(new FileReader(path)); reader.read(char[] buffer); 

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

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

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

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

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

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

char any = myScanner.findInLine (“.”). charAt (0);

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

  import java.util.Scanner; class ReverseWord { public static void main(String args[]){ Scanner myScanner=new Scanner(System.in); char c1,c2,c3,c4; c1 = myScanner.findInLine(".").charAt(0); c2 = myScanner.findInLine(".").charAt(0); c3 = myScanner.findInLine(".").charAt(0); c4 = myScanner.findInLine(".").charAt(0); System.out.print(c4); System.out.print(c3); System.out.print(c2); System.out.print(c1); System.out.println(); } } 

Это напечатает 1 символ в строке из файла.

  try { FileInputStream inputStream = new FileInputStream(theFile); while (inputStream.available() > 0) { inputData = inputStream.read(); System.out.println((char) inputData); } inputStream.close(); } catch (IOException ioe) { System.out.println("Trouble reading from the file: " + ioe.getMessage()); } 
  • Преобразование символов в целые числа в Java
  • Каков самый простой / лучший / самый правильный способ перебора символов строки в Java?
  • В чем смысл + в регулярном выражении?
  • Как удалить определенные символы из строки в C ++?
  • Interesting Posts

    Не удается удалить бесконечно повторяющуюся папку в папке в папке и т. Д.

    Атрибут .NET DefaultValue

    Исключение регулярного выражения JavaScript (недопустимая группа)

    Windows 10 – внешний монитор показывает 1 | 6, а мой ноутбук – 5 – что это?

    использует-разрешение и разрешение на разрешения для android в файле manifest.xml

    Как я могу восстановить или установить восстановление / восстановление системы после повреждения BCD?

    Развертывание IIS7 – дублирование ‘system.web.extensions / scripting / scriptResourceHandler’

    «Заполнение недопустимо и не может быть удалено» с помощью AesManaged

    как настроить макет snackBar?

    Лучший способ создать ключи AES, чем посев SecureRandom

    Весенний спящий шаблон, когда использовать и почему?

    Как щелкнуть OK в диалоговом окне на другом рабочем столе?

    Поставщик Entity Framework не найден для поставщика услуг «MySql.Data.MySqlClient» ADO.NET

    Использование разных загрузчиков classов для разных тестов JUnit?

    Удаленный рабочий стол Windows с автоматической сменой разрешения

    Давайте будем гением компьютера.