MalformedInputException beim Versuch, die gesamte Datei zu lesen

8

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 ...

    
opensas 11.11.2012, 00:40
quelle

3 Antworten

4

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.

verwenden

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.

    
vossad01 11.11.2012, 01:25
quelle
4

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   und hasNext ...

     

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.

    
Travis Brown 11.11.2012 01:42
quelle
3

Wenn Sie nur die Bytes in einfache lateinische Daten konvertieren möchten:

%Vor%     
Kai Sellgren 15.06.2014 13:35
quelle

Tags und Links