Fim de arquivo FileReader[RESOLVIDO]

Pessoal estava estudando um pouco sobre leitura de arquivos, mais precisamente a classe FileReader lendo caractere por caractere, pela documentação (http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html#read()) quando o arquivo chegasse ao fim deveria retornar -1, só que para mim esta retornando 65535 quando atinge o final, é erro na documentação ou é um erro comigo?


 File arquivo = new File("teste.txt");
        try{
        	FileReader fr = new FileReader(arquivo);
            char  c =  (char) fr.read();
            while( c != 65535){
                System.out.print(  c );
                c =  (char) fr.read();
            }

        	fr.close();
    	}catch(IOException ex){
    		ex.printStackTrace();
    	}

O problema é na hora do casting do int retornado pelo método read para o char. Você tem que ler o que é retornado do método read em uma variável do tipo int e comparar este valor inteiro com -1. Se você converter para char antes disso este valor será convertido para 65535.
Executa este método que acho que irá demonstrar isso melhor:

public static void main(String[] args) {
		int i = -1;
		System.out.println("Binário: " + Integer.toBinaryString(i));
		System.out.println("Binário (após o casting): " + Integer.toBinaryString(((char)i)));
		System.out.println("Inteiro à partir do binário após o casting: " + Integer.parseInt("" + Integer.toBinaryString((char)i), 2));
		System.out.println("Casting: " + (int)((char)i));
}

Obrigado cara, agora entendi, ao fazer o cast ele corta os 16 bits a esquerda já que um inteiro não cabe dentro de int, virando 65535, gostei do teu exemplo

Altera o título da mensagem para [RESOLVIDO]! :slight_smile:

Ler um caracter de cada vez é uma receita certa para fazer um programa lento.
Normalmente você pode tentar ler uma linha de cada vez (usando BufferedReader).
Se você quer simplesmente copiar um arquivo para outro, deve usar FileChannel em vez de FileReader ou FileInputStream.