readChar do DataInputStream

Bom dia pessoal!

Eu não estou conseguindo ler um arquivo caracter a caracter, usando o readChar() do DataInputStream.
Ele lê um caracter estranho no lugar do que está no arquivo.
Segue o código.

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Teste2
{
    public static void main(String[] args)
    {
    	File file = new File("C:\\teste.txt");
    
    	char c;
    	try {
    	   	FileInputStream fileinput = new FileInputStream(file);
    		DataInputStream datainput = new DataInputStream(fileinput);
			
    		c = datainput.readChar();
            System.out.println(""+c);
    	} catch (IOException e) {
    		System.out.println(e.getMessage());
    	}
    }
}

DataInputStream.readChar lê 2 bytes de cada vez. Ou seja, só se seu arquivo texto estiver codificado como Unicode e ainda com o byte mais significativo primeiro (diferentemente da codificação do Notepad, que salva com o byte menos significativo primeiro) é que você vai conseguir ler corretamente seu texto.

O correto é usar FileReader para ler seu arquivo. Usualmente você faria:

try {
    BufferedReader br = new BufferedReader (new FileReader (file));
    String line;
    while ((line = br.readLine()) != null) {
        // Processando uma linha de cada vez
    }
}

Ler 1 caracter de cada vez é MUITO lento.

Esqueci de fechar o tal arquivo. Não se esqueça de usar “close” senão seu programa vai ficar maluco (por exemplo, você tenta abrir o arquivo de novo e não consegue, ou então você tenta abrir o arquivo por um outro programa e ele reclama que o arquivo está travado.)

Vou criar então um arquivo unicode, pois para o que preciso tem que ler caracter a caracter.
No java só tem essa opção?

Você pode ler caracter a caracter com read.
Estranho (o nome deveria ser “readChar”, não?) e ainda mais estranho (porque ele retorna um int, não um char) mas é verdade.

try {
    BufferedReader br = new BufferedReader (new FileReader (file));
    int rc;
    while ((rc = br.read()) != -1) {
        char ch = (char) rc; // este é o caracter lido
        // Processando um caracter de cada vez.
    }
}

Obrigada! Funcionou!