Pergunta

Eu estou acostumado com o getchar() c-estilo, mas parece que não há nada comparável em java. Eu estou construindo um analisador léxico, e eu preciso de ler no caractere de entrada pelo caráter.

Eu sei que posso usar o scanner para digitalizar em um símbolo ou linha e analisar através o caractere de char-by-forma, mas que parece complicado para cordas distribuída em várias linhas. Existe uma maneira de obter apenas o próximo caractere do buffer de entrada em Java, ou devo apenas plug afastado com a classe Scanner?

A entrada é um arquivo, não o teclado.

Foi útil?

Solução

Use Reader.read () . Um valor de retorno de -1 significa terminar de fluxo; o resto, elenco de caractere .

Este código lê dados de caracteres a partir de uma lista de argumentos de arquivo:

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);
        }
    }
}

A única coisa ruim sobre o código acima é que ele usa o conjunto de caracteres padrão do sistema. Sempre que possível, prefira uma codificação conhecida (idealmente, uma codificação Unicode, se você tem uma escolha). Veja a href="http://java.sun.com/javase/6/docs/api/java/nio/charset/Charset.html" rel="noreferrer"> Charset classe para mais. (Se você sentir masoquista, você pode ler este guia para codificação de caracteres .)

(Uma coisa que você pode querer olhar para fora são caracteres Unicode suplementares -. Aqueles que exigem dois valores CHAR para loja Veja o classe de personagem para mais detalhes;. este é um caso extremo de que, provavelmente, não será aplicada a lição de casa)

Outras dicas

Combinando as recomendações de outras pessoas para especificar uma codificação de caracteres e colocar em buffer de entrada, aqui está o que eu acho que é uma resposta muito completa.

Supondo que você tenha um objeto File que representa o arquivo que você quer ler:

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
}

Outra opção é não ler coisas em caractere por caractere - leia o arquivo inteiro na memória. Isso é útil se você precisa olhar para os personagens mais de uma vez. Uma maneira simples de se fazer isto é:

  /** 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();
      }
    }
}

Envolva seu fluxo de entrada em um leitor tamponada, em seguida, usar o método de leitura para ler um byte de cada vez até o fim do fluxo.

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);          
        }       
    }   
}

Se eu fosse você eu tinha acabado de usar um scanner e use ".nextByte ()". Você pode lançar que para um char e você é bom.

Você tem várias opções se você usar BufferedReader. Este leitor tamponada é mais rápido do que leitor para que possa envolvê-la.

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

este lê linha na matriz de char. Você tem opções semelhantes. Olhada documentação.

Envolva seu leitor em um BufferedReader , que mantém um tampão permitindo muito mais rápido lê geral. Você pode então usar read () para ler um único caractere (que você precisa elenco). Você também pode usar readLine () para buscar uma linha inteira e, em seguida, quebrar que em caracteres individuais. O BufferedReader também suporta a marcação e voltando, então se você precisar, você pode ler uma linha várias vezes.

De um modo geral, você quer usar um BufferedReader ou BufferedInputStream no topo de qualquer fluxo você está realmente usando desde o tampão mantêm vai fazer várias leituras muito mais rápido.

Em Java 5 novo recurso adicionado que é o método Scanner que dá a oportunidade de ler caracteres de entrada de caracteres em Java.

por exemplo; para uso Scanner java.util.Scanner método de importação; depois no método principal: definir

Scanner myScanner = new Scanner (System.in); // para o personagem leitura

caractere qualquer coisa = myScanner.findInLine ( "") charAt (0).;

Você pode armazenar qualquer coisa de caráter único, se você quer mais ler mais caráter declarar mais objeto como anything1, anything2 ... mais exemplo para a sua resposta por favor verifique em sua mão (copiar / colar)

     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();

   }
  }

Isto irá imprimir 1 caracteres por linha do arquivo.

    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());
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top