Estou desenvolvendo uma aplicação que fica lendo arquivos, que são gerados diariamente.
E para ler os arquivos eu uso o método RandomAccessFile.readByte, e faço um casting para char.
Debugando a mesma, vi que quando tenho um caracter especial como, “ã”, o caracter é “alterado” por exemplo para “?”, alguém sabe explicar pq isso acontece?
Como eu posso solucionar este erro?
[RESOLVIDO] Problema ao ler arquivo
7 Respostas
Seu arquivo está em um formato diferente do formato UNICODE 16 bits (UTF 16), pode ser que esteja em UTF 8 mas o mais provável é que seu arquivo esteja no formato ASCII.
Primeiro descubra que tipo está seu arquivo. Depois pesquise conversão para o formato UNICODE 16.
Se não conseguir posta aqui.
Eu estou lendo os dados de um txt, que está em ASCII.
Sabe de alguma solução que faça esse parse?
A classe InputStreamReader permite que você utilize uma string para dizer o char set acredito que no seu caso seja US-ASCII.
Dá uma olhada no Java doc
O problema é que eu tenho que usar a classe RandomAccessFile, para poder gravar o ponteiro, de onde parou a leitura e poder depois recomeçar do ponto em que paroou o mesmo.
Bom,
Então o único caminho que eu conheço é utilizar a classe do Java NIO Charset
Charset c = Charset.forName(“US-ASCII”);
CharsetDecoder decoder = c.newDecoder();
CharsetEncoder encoder = c.newEncoder();
Dá uma olhada no Javadoc e posta o resultado aqui, eu nunca precisei usar essa classe.
Resolvi o problema desta maneira, usando a classe Charset que você falou e a classe RandomAccessFile 
Abaixo segue a parte do código para a solução:
//Buffer aonde ficará armazenado os dados do arquivo, os dados serão lidos conforme o tamanho do buffer, neste caso eu estou trazendo um caracter por vez.
byte[] buffer = new buffer[1];
//Lendo o arquivo
randomAcessFile.read(buffer);
//Convertendo os dados para ISO-8859-1
String data = new String(buffer, Charset.forName("ISO-8859-1");
No método do read da classe RandomAccessFile eu preciso passar um array de bytes indicando qual vai zer o tamanho do buffer, ou seja, quantos bytes eu quero trazer por vez.
Depois é só jogar o array de bytes dentro da classe String, que ela irá converter os bytes para uma string, com o encode passado para mesma.
Valeu pela ajuda!!!
Valeu por postar a resolução. Em breve esse post estará na busca do google e sempre que alguém tiver o mesmo problema vai encontrar a solução.