Ler char por char de arquivo com Scanner

Estou fazendo um trabalho de compiladores. Nessa primeira parte eu tenho que implementar um analisador léxico, e pra isso tenho que ler um arquivo e classificar os tokens.
Preciso ler char por char do arquivo para fazer o tratamento e classificação do que eu ler. Mas não consigo fazer a leitura de um char com o Scanner.
Outra coisa, o scanner lê caracteres especiais como quebra de linha e fim de arquivo?

Deve ser, obrigatoriamente, com a classe Scanner? Você pode fazer isso sem muitos problemas através da classe BufferedReader.

Nunca usei. Sou muito acostumado com o Scanner, acho que é o mais simples, mas se não me satisfaz vou ter que partir pra outro lado.
Me da um exemplo ae entao por favor.

Nunca usei. Sou muito acostumado com o Scanner, acho que é o mais simples, mas se não me satisfaz vou ter que partir pra outro lado.
Me da um exemplo ae entao por favor.[/quote]

Basicamente é isso:

try { BufferedReader in = new BufferedReader(new FileReader("/home/andre/Arquivo/file.txt")); char ch; /* enquanto não achar f */ while ( (ch = (char) in.read()) != 'f'){ System.out.println(ch); } in.close(); } catch (IOException e){ System.out.println(e.getMessage()); } }

meu arquivo:

abc
def

saída do programa:

[b]a
b
c

d
e[/b]

No caso de uma String é quase a mesma coisa, mas você pode ler o arquivo até chegar em null:

String ch; while ( (ch = in.readLine()) != null){ System.out.println(ch); }

public static char proximoChar() throws IOException { FileReader read = new FileReader(entrada); BufferedReader reader = new BufferedReader(read); return (char) reader.read(); }

Deu certinho, porém a cada vez que eu chamo o método, ele sempre me retorna o primeiro caractere. Preciso que a cada vez que eu chame ele me retorne o proximo e assim fosse percorrendo o arquivo.
Como faço?

[quote=Heartbreaker] public static char proximoChar() throws IOException { FileReader read = new FileReader(entrada); BufferedReader reader = new BufferedReader(read); return (char) reader.read(); }

Deu certinho, porém a cada vez que eu chamo o método, ele sempre me retorna o primeiro caractere. Preciso que a cada vez que eu chame ele me retorne o proximo e assim fosse percorrendo o arquivo.
Como faço?[/quote]

É porque você só leu o primeiro caractere. Você deve percorrer, de acordo com a posição, e passar o valor para uma variável. Por exemplo:

char ch = 0; for (int i = 0; i < 2; i++){ ch = (char) in.read(); } System.out.println(ch);

Saída:

b

Ou seja, imprimiu o segundo caractere do meu arquivo.

Desculpa se estou sendo grosso mas isso ta me parecendo uma baita gambiarra rsrsrs.
Pq quando eu for ler o milésimo caractere do arquivo, eu vou ter que ler 999 antes de retornar o que eu quero.

[quote=Heartbreaker]Desculpa se estou sendo grosso mas isso ta me parecendo uma baita gambiarra rsrsrs.
Pq quando eu for ler o milésimo caractere do arquivo, eu vou ter que ler 999 antes de retornar o que eu quero.[/quote]

Eu não sei se em Java é possível ir diretamente à uma determinada posição no arquivo, mas dessa forma não me parece uma gambiarra. Você teria de por um contador em seu programa e for() percorreria de acordo com valor do contador.

tenho uma sugestão talvez isso te ajude:

[code]private static int index = 0;

public static String ler() throws IOException {  
    FileReader read = new FileReader(entrada);  
    BufferedReader reader = new BufferedReader(read);
    String str = "";
    String line = reader.readLine();
    while (line != null) {
    	str += (line + "\n");
    }  
    return str;
}

public static char proximoChar() throws IOException {
	char[] chars = ler().toCharArray();
	char ch = chars[index];
	index++;
	return ch;
}[/code]

o metodo ler() irá ler seu arquivo por completo e retornar uma String ai com o metodo proximoChar() ele vai retornar o char do indice da array de chars interna esse indece é um global amazanado na classe.

espero que ajude até mais

tentei dar um println na str pra ver se imprimia e nada…

Tenho a msma dúvida, como faço para contar qntos caracteres tem na variável Stringw

Por favor poste o seu código para que eu possa analizar e ver qual o problema, ate +

Crie um tópico com a sua dúvida, para inicio de conversa.


    String texto = "Linguagem Java";
        int qtdeChar = texto.length();
        
        System.out.print(qtdeChar); // Saída: 14

abra um tópico mais basicamente acredito que seria:

String str = "palavra"; System.out.println(str.toCharArray().length);

que tem saida o número 7

pelo que entendi é isso que você quer GUICS

Valew galera ficou assim:

public static void leArquivo() throws IOException { FileReader read = new FileReader(entrada); BufferedReader reader = new BufferedReader(read); StringBuilder string = new StringBuilder(); Character c; int i = reader.read(); if (EOF(i)) { JOptionPane.showMessageDialog(null, "Arquivo Vazio"); System.exit(0); } do { c = (char) i; string.append(c); i = reader.read(); } while (!EOF(i)); chars = string.toString().toCharArray(); } public static Character proximoChar() { try { return chars[index++]; } catch (ArrayIndexOutOfBoundsException e) { return Character.PRIVATE_USE; } }

Problema resolvido?

[code]

String texto = "Linguagem Java";
    int qtdeChar = texto.length();
    
    System.out.print(qtdeChar); // Saída: 14

[/code][/quote]
Valeu, tirou minha duvida amigo.