Как читать ввод по-символам в Java?
Я привык к c-style getchar()
, но похоже, что нет ничего сопоставимого для java. Я создаю лексический анализатор, и мне нужно прочитать входной символ по символу.
Я знаю, что я могу использовать сканер для сканирования в токене или строке и анализировать через маркер char-by-char, но это кажется громоздким для строк, охватывающих несколько строк. Есть ли способ просто получить следующий символ из входного буфера в Java, или я должен просто подключиться к classу Scanner?
Вход представляет собой файл, а не клавиатуру.
- Какие символы мне нужно скрывать в документах XML?
- Чистые файлы исходного кода невидимых символов
- Почему нам нужно поставить пробел до% c?
- Индексы всех вхождений символа в строку
- преобразовать формат столбца data.frame из символа в фактор
- Удалить все вхождения символа из строки
- Преобразовать один символ в строку?
- Как проверить, отображается ли один символ в строке?
- Загрузить пакет R из символьной строки
- Заменить символ по определенному индексу в строке?
- Как бороться с конфликтами символов между статически связанными библиотеками?
- "\ N" или '\ n' или std :: endl в std :: cout?
- Как изменить диакритические символы на недиакритические
Используйте 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()); }