Je crée un programme de comptage de mots simple en Java qui lit les fichiers texte d'un répertoire.
Cependant, je continue à recevoir l'erreur:
java.nio.charset.MalformedInputException: Input length = 1
à partir de cette ligne de code:
BufferedReader reader = Files.newBufferedReader(file,Charset.forName("UTF-8"));
Je sais que j'obtiens probablement cela parce que j'ai utilisé un Charset
qui n'incluait pas certains des caractères dans les fichiers texte, dont certains incluaient des caractères d'autres langues. Mais je veux inclure ces personnages.
J'ai appris plus tard aux JavaDocs que le Charset
est facultatif et utilisé uniquement pour une lecture plus efficace des fichiers, j'ai donc changé le code en:
BufferedReader reader = Files.newBufferedReader(file);
Mais certains fichiers lancent toujours le fichier MalformedInputException
. Je ne sais pas pourquoi.
Je me demandais s'il existe un forfait tout compris Charset
qui me permettra de lire des fichiers texte avec de nombreux types de caractères différents ?
Merci.
la source
ISO-8859-1
et ça marche bien. Je pense que c'est pour les personnages européens, ce qui est bien.UTF-16
Cependant, je ne sais toujours pas pourquoi cela ne fonctionne pas.ISO-8859-1
, alors ce n'est pas le casUTF-16
. Ces encodages sont complètement différents. Un fichier ne peut pas être les deux.Création de BufferedReader à partir de Files.newBufferedReader
lors de l'exécution de l'application, il peut lever l'exception suivante:
Mais
fonctionne bien.
La différence est que, le premier utilise l'action par défaut CharsetDecoder.
tandis que ce dernier utilise l'action REPLACE.
la source
ISO-8859-1 est un jeu de caractères tout compris, dans le sens où il est garanti de ne pas lancer MalformedInputException. C'est donc bon pour le débogage, même si votre entrée n'est pas dans ce jeu de caractères. Alors:-
J'avais des caractères double-guillemets à droite / guillemets à gauche dans mon entrée, et US-ASCII et UTF-8 ont lancé MalformedInputException sur eux, mais ISO-8859-1 a fonctionné.
la source
J'ai également rencontré cette exception avec un message d'erreur,
et a constaté qu'un bug étrange se produit lors de la tentative
pour écrire une chaîne "orazg 54" transtypée à partir d'un type générique dans une classe.
Cette chaîne est de longueur 9 contenant des caractères avec les points de code suivants:
111 114 97122103 9 53 52 10
Cependant, si BufferedWriter de la classe est remplacé par:
il peut écrire avec succès cette chaîne sans exceptions. De plus, si j'écris la même chaîne créée à partir des caractères, cela fonctionne toujours bien.
Auparavant, je n'avais jamais rencontré d'exception lors de l'utilisation du premier BufferedWriter pour écrire des chaînes. C'est un bug étrange qui se produit dans BufferedWriter créé à partir de java.nio.file.Files.newBufferedWriter (chemin, options)
la source
ISO_8859_1 a travaillé pour moi! Je lisais un fichier texte avec des valeurs séparées par des virgules
la source
J'ai écrit ce qui suit pour imprimer une liste de résultats à la norme en fonction des jeux de caractères disponibles. Notez qu'il vous indique également quelle ligne échoue à partir d'un numéro de ligne basé sur 0 au cas où vous dépanneriez le caractère qui cause des problèmes.
la source
essayez ceci .. j'ai eu le même problème, la mise en œuvre ci-dessous a fonctionné pour moi
puis utilisez Reader où vous le souhaitez.
foreg:
la source
Eh bien, le problème est que
Files.newBufferedReader(Path path)
est implémenté comme ceci:Donc, fondamentalement, il est inutile de spécifier à
UTF-8
moins que vous ne vouliez être descriptif dans votre code. Si vous voulez essayer un jeu de caractères "plus large", vous pouvez essayer avecStandardCharsets.UTF_16
, mais vous ne pouvez pas être sûr à 100% d'obtenir tous les caractères possibles de toute façon.la source
vous pouvez essayer quelque chose comme ça, ou simplement copier et coller la pièce ci-dessous.
la source
while(exception)
boucle pour toujours s'il ne trouve jamais un jeu de caractères fonctionnel dans le tableau. Le gestionnaire d'exceptions doit renvoyer si la fin du tableau est atteinte et qu'aucun jeu de caractères fonctionnel n'est trouvé. De plus, au moment de la rédaction de cet article, cette réponse comptait "-2" votes. Je l'ai voté à "-1". Je pense que la raison pour laquelle il a obtenu des votes négatifs est que les explications sont insuffisantes. Bien que je comprenne ce que fait le code, d'autres personnes ne le peuvent pas. Donc, un commentaire comme "vous pouvez essayer quelque chose comme ça" peut ne pas être apprécié par certaines personnes.UTF-8 fonctionne pour moi avec des caractères polonais
la source