Ich erstelle ein einfaches Wordcount-Programm in Java, das die textbasierten Dateien eines Verzeichnisses liest.
Ich erhalte jedoch immer wieder den Fehler:
java.nio.charset.MalformedInputException: Input length = 1
aus dieser Codezeile:
BufferedReader reader = Files.newBufferedReader(file,Charset.forName("UTF-8"));
Ich weiß, dass ich das wahrscheinlich bekomme, weil ich ein verwendet habe Charset
, das einige der Zeichen in den Textdateien nicht enthielt, von denen einige Zeichen anderer Sprachen enthielten. Aber ich möchte diese Zeichen einschließen.
Ich habe später bei den JavaDocs erfahren, dass das Charset
optional ist und nur zum effizienteren Lesen der Dateien verwendet wird. Deshalb habe ich den Code geändert in:
BufferedReader reader = Files.newBufferedReader(file);
Aber einige Dateien werfen immer noch die MalformedInputException
. Ich weiß nicht warum.
Ich habe mich gefragt, ob es ein All-Inclusive-Angebot gibt Charset
, mit dem ich Textdateien mit vielen verschiedenen Zeichentypen lesen kann .
Vielen Dank.
quelle
ISO-8859-1
und es funktioniert gut. Ich denke, es ist für europäische Charaktere, was in Ordnung ist. Ich weiß immer noch nicht, warumUTF-16
es nicht funktioniert.ISO-8859-1
, dann ist es nichtUTF-16
. Diese Kodierungen sind völlig unterschiedlich. Eine Datei kann nicht beides sein.Erstellen von BufferedReader aus Files.newBufferedReader
Beim Ausführen der Anwendung kann die folgende Ausnahme ausgelöst werden:
Aber
funktioniert gut.
Der Unterschied besteht darin, dass der erstere die Standardaktion CharsetDecoder verwendet.
während letzterer die Aktion REPLACE verwendet.
quelle
ISO-8859-1 ist ein All-Inclusive-Zeichensatz in dem Sinne, dass garantiert keine MalformedInputException ausgelöst wird. Es ist also gut zum Debuggen, auch wenn Ihre Eingabe nicht in diesem Zeichensatz enthalten ist. So:-
Ich hatte einige doppelte Anführungszeichen / doppelte linke Anführungszeichen in meiner Eingabe, und sowohl US-ASCII als auch UTF-8 haben MalformedInputException darauf geworfen, aber ISO-8859-1 hat funktioniert.
quelle
Ich bin auch auf diese Ausnahme mit der Fehlermeldung gestoßen.
und festgestellt, dass ein seltsamer Fehler auftritt, wenn versucht wird, zu verwenden
um einen String "orazg 54" zu schreiben, der von einem generischen Typ in einer Klasse umgewandelt wurde.
Dieser String hat die Länge 9 und enthält Zeichen mit den folgenden Codepunkten:
111 114 97 122 103 9 53 52 10
Wenn jedoch der BufferedWriter in der Klasse durch Folgendes ersetzt wird:
Es kann diesen String ohne Ausnahmen erfolgreich schreiben. Wenn ich denselben String schreibe, der aus den Zeichen erstellt wurde, funktioniert er außerdem weiterhin in Ordnung.
Bisher bin ich bei der Verwendung des ersten BufferedWriter zum Schreiben von Strings nie auf eine Ausnahme gestoßen. Es ist ein seltsamer Fehler, der bei BufferedWriter auftritt, der aus java.nio.file.Files.newBufferedWriter (Pfad, Optionen) erstellt wurde.
quelle
ISO_8859_1 Hat für mich gearbeitet! Ich habe eine Textdatei mit durch Kommas getrennten Werten gelesen
quelle
Ich habe Folgendes geschrieben, um eine Liste der Ergebnisse zu drucken, die basierend auf den verfügbaren Zeichensätzen standardisiert werden sollen. Beachten Sie, dass Sie auch erfahren, welche Zeile von einer auf 0 basierenden Zeilennummer ausfällt, falls Sie Fehler beheben, welches Zeichen Probleme verursacht.
quelle
Versuchen Sie dies .. Ich hatte das gleiche Problem, unten Implementierung funktionierte für mich
Verwenden Sie dann Reader, wo immer Sie möchten.
foreg:
quelle
Nun, das Problem ist, dass
Files.newBufferedReader(Path path)
es so implementiert wird:Grundsätzlich macht es keinen Sinn,
UTF-8
etwas anzugeben, es sei denn, Sie möchten in Ihrem Code eine Beschreibung abgeben. Wenn Sie einen "breiteren" Zeichensatz ausprobieren möchten, können Sie es versuchenStandardCharsets.UTF_16
, aber Sie können nicht 100% sicher sein, dass Sie trotzdem jeden möglichen Charakter erhalten.quelle
UTF-8 funktioniert bei mir mit polnischen Zeichen
quelle
Sie können so etwas ausprobieren oder einfach kopieren und unter das Stück einfügen.
quelle
while(exception)
Schleife möglicherweise für immer erstellen, wenn er nie einen funktionierenden Zeichensatz im Array findet. Der Ausnahmebehandler sollte erneut ausgelöst werden, wenn das Ende des Arrays erreicht ist und kein funktionierender Zeichensatz gefunden wird. Außerdem hatte diese Antwort zum Zeitpunkt des Schreibens "-2" Stimmen. Ich habe es auf "-1" hochgestuft. Ich denke, der Grund für die negativen Stimmen ist, dass es keine ausreichende Erklärung gibt. Während ich verstehe, was der Code tut, können andere Leute nicht. Ein Kommentar wie "Sie können so etwas ausprobieren" wird von manchen Leuten möglicherweise nicht geschätzt.