Ich habe eine 132-kb-Datei (Sie können nicht wirklich sagen, dass sie groß ist) und ich versuche, sie von der Scala-REPL zu lesen, aber ich kann nicht mehr als 2048 char lesen, weil es mir eine java.nio.charset.MalformedInputException
-Ausnahme gibt
Dies sind die Schritte, die ich mache:
%Vor%Irgendeine Idee, was könnte falsch sein?
-
Anscheinend war das Problem, dass die Datei nicht UTF-codiert war
Ich habe es als UTF gespeichert und alles funktioniert, ich gebe einfach mkString auf dem Iterator aus und ruft den gesamten Inhalt der Datei ab
Das Seltsame ist, dass der Fehler nur durch die ersten 2048 Zeichen ausgelöst wurde ...
Kann ohne die Datei nicht sicher sein, aber die Dokumentation der Ausnahme zeigt an, dass sie ausgelöst wird, "wenn eine Eingabe-Byte-Sequenz für einen gegebenen Zeichensatz nicht zulässig ist oder eine eingegebene Zeichensequenz keine gültige sechzehn-Bit-Unicode-Sequenz ist". ( MalformedInputException javadoc )
Ich vermute, dass bei 2049 das erste gefundene Zeichen ist, das mit der Standard-JVM-Zeichencodierung in Ihrer Umgebung nicht gültig ist. Berücksichtigen Sie explizit die Zeichencodierung der Datei, indem Sie eine der Überladungen auf fromFile.
Wenn die Anwendung plattformübergreifend ist, sollten Sie wissen, dass die Standardzeichencodierung auf der JVM von Plattform zu Plattform unterschiedlich ist. Wenn Sie also mit einer bestimmten Codierung arbeiten, möchten Sie diese beim Starten von Ihre Anwendung oder spezifizieren Sie sie bei jedem Aufruf mit der entsprechenden Überladung.
Jedes Mal, wenn Sie take
zweimal im selben Iterator aufrufen, sind alle Wetten deaktiviert. Iteratoren sind von Natur aus zwingend, und sie mit funktionalen Idiomen zu mischen, ist bestenfalls heikel. Die meisten Iteratoren, die Sie in der Standardbibliothek finden, verhalten sich in dieser Hinsicht ziemlich gut, aber wenn Sie take
oder drop
oder filter
usw. verwendet haben, sind Sie nicht definiert Land, und im Prinzip könnte alles passieren.
Von den Dokumenten :
Es ist besonders wichtig zu beachten, dass, wenn nicht anders angegeben, Man sollte niemals einen Iterator verwenden, nachdem man eine Methode darauf aufgerufen hat . Die Zwei wichtigste Ausnahmen sind auch die einzigen abstrakten Methoden:
next
undhasNext
...
def take(n: Int): Iterator[A]
...Wiederverwendung: Nach dem Aufruf dieser Methode sollte man den Iterator verwerfen wurde aufgerufen und verwendet nur den Iterator, der zurückgegeben wurde. Verwendung der Der alte Iterator ist nicht definiert und kann sich ändern ändert sich auch in den neuen Iterator.
Es ist also wahrscheinlich nicht wert, genau herauszufinden, was hier schief gelaufen ist.
Wenn Sie nur die Bytes in einfache lateinische Daten konvertieren möchten:
%Vor%