Как мне читать входные данные посимвольно в Java?

StackOverflow https://stackoverflow.com/questions/811851

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Ввод осуществляется с помощью файла, а не с клавиатуры.

Это было полезно?

Решение

Используйте Reader.read () . Возвращаемое значение -1 означает конец потока; еще приведите к 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();
      }
    }
}

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

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 . Этот буферизованный ридер работает быстрее, чем ридер, поэтому вы можете обернуть его.

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

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

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

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

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

например;для использования метода сканирования импортируйте java.util.Сканер;после в основном методе: определите

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

char anything=myScanner.findInLine(".").charAt(0);

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

     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());
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top