Estou criando um programa simples de contagem de palavras em Java que lê os arquivos baseados em texto de um diretório.
No entanto, continuo recebendo o erro:
java.nio.charset.MalformedInputException: Input length = 1
desta linha de código:
BufferedReader reader = Files.newBufferedReader(file,Charset.forName("UTF-8"));
Sei que provavelmente entendi isso porque usei um Charset
que não incluía alguns dos caracteres nos arquivos de texto, alguns dos quais incluíam caracteres de outros idiomas. Mas eu quero incluir esses personagens.
Posteriormente, aprendi nos JavaDocs que o Charset
é opcional e usado apenas para uma leitura mais eficiente dos arquivos, então mudei o código para:
BufferedReader reader = Files.newBufferedReader(file);
Mas alguns arquivos ainda jogar a MalformedInputException
. Não sei por quê.
Eu queria saber se existe um all-inclusive Charset
que me permitirá ler arquivos de texto com muitos tipos diferentes de caracteres ?
Obrigado.
fonte
ISO-8859-1
e funciona bem. Acho que é para personagens europeus, o que é bom. Ainda não sei porUTF-16
que não funciona, no entanto.ISO-8859-1
, então é nãoUTF-16
. Essas codificações são completamente diferentes. Um arquivo não pode ser ambos.Criando BufferedReader de Files.newBufferedReader
ao executar o aplicativo, ele pode lançar a seguinte exceção:
Mas
funciona bem.
A diferença é que o primeiro usa a ação padrão CharsetDecoder.
enquanto o último usa a ação REPLACE.
fonte
ISO-8859-1 é um conjunto de caracteres completo, no sentido de que é garantido que não lançará MalformedInputException. Portanto, é bom para depuração, mesmo se sua entrada não estiver neste conjunto de caracteres. Assim:-
Eu tinha alguns caracteres de aspas duplas à direita / aspas duplas à esquerda em minha entrada e tanto US-ASCII quanto UTF-8 exibiram MalformedInputException neles, mas ISO-8859-1 funcionou.
fonte
Eu também encontrei essa exceção com mensagem de erro,
e descobri que algum bug estranho ocorre ao tentar usar
para escrever uma string "orazg 54" convertida de um tipo genérico em uma classe.
Esta string tem comprimento 9 contendo caracteres com os seguintes pontos de código:
111 114 97 122 103 9 53 52 10
No entanto, se BufferedWriter na classe for substituído por:
ele pode escrever com sucesso esta String sem exceções. Além disso, se eu escrever a mesma string criada a partir dos caracteres, ainda funcionará bem.
Anteriormente, nunca encontrei nenhuma exceção ao usar o primeiro BufferedWriter para escrever quaisquer Strings. É um bug estranho que ocorre no BufferedWriter criado a partir de java.nio.file.Files.newBufferedWriter (caminho, opções)
fonte
ISO_8859_1 Funcionou para mim! Eu estava lendo um arquivo de texto com valores separados por vírgula
fonte
Escrevi o seguinte para imprimir uma lista de resultados para padronizar com base nos conjuntos de caracteres disponíveis. Observe que também informa qual linha falha a partir de um número de linha com base em 0, caso você esteja solucionando o caractere que está causando problemas.
fonte
tente isso .. eu tive o mesmo problema, a implementação funcionou para mim
em seguida, use o Reader onde quiser.
anterior:
fonte
Bem, o problema é que
Files.newBufferedReader(Path path)
é implementado assim:então, basicamente, não há nenhum ponto em especificar, a
UTF-8
menos que você queira ser descritivo em seu código. Se você quiser tentar um conjunto de caracteres "mais amplo", pode tentarStandardCharsets.UTF_16
, mas não pode ter 100% de certeza de obter todos os caracteres possíveis de qualquer maneira.fonte
você pode tentar algo assim, ou apenas copiar e colar a parte abaixo.
fonte
while(exception)
loop para sempre se nunca encontrar um conjunto de caracteres de trabalho na matriz. O manipulador de exceção deve relançar se o final da matriz for alcançado e nenhum conjunto de caracteres de trabalho for encontrado. Além disso, no momento em que escrevo, essa resposta tinha "-2" votos. Eu votei positivamente para "-1". Acho que a razão pela qual obteve votos negativos é porque não há explicação suficiente. Embora eu entenda o que o código faz, outras pessoas podem não entender. Portanto, um comentário como "você pode tentar algo assim" pode não ser apreciado por algumas pessoas.UTF-8 funciona para mim com caracteres poloneses
fonte