Comment faire pour résoudre java.nio.jeu de caractères.UnmappableCharacterException en Scala 2.8.0?
Je suis en utilisant Scala 2.8.0 et en essayant de lire pipe fichier délimité par des virgules, comme dans le code à l'aide de l'extrait ci-dessous:
object Main {
def main(args: Array[String]) :Unit = {
if (args.length > 0) {
val lines = scala.io.Source.fromPath("QUICK!LRU-2009-11-15.psv")
for (line <-lines)
print(line)
}
}
}
Voici l'erreur:
Exception in thread "main" java.nio.jeu de caractères.UnmappableCharacterException: Entrée longueur = 1
à java.nio.jeu de caractères.CoderResult.throwException(CoderResult.java:261)
au coucher du soleil.nio.cs.StreamDecoder.implRead(StreamDecoder.java:319)
au coucher du soleil.nio.cs.StreamDecoder.lire(StreamDecoder.java:158)
à java.io.InputStreamReader.lire(InputStreamReader.java:167)
à java.io.BufferedReader.de remplissage(BufferedReader.java:136)
à java.io.BufferedReader.lire(BufferedReader.java:157)
à la scala.io.BufferedSource$$anonfun$1$$anonfun$s'appliquent$1.appliquer(BufferedSource.scala:29)
à la scala.io.BufferedSource$$anonfun$1$$anonfun$s'appliquent$1.appliquer(BufferedSource.scala:29)
à la scala.io.Codec.wrap(Codec.scala:65)
à la scala.io.BufferedSource$$anonfun$1.appliquer(BufferedSource.scala:29)
à la scala.io.BufferedSource$$anonfun$1.appliquer(BufferedSource.scala:29)
à la scala.collection.Itérateur$$anon$14.prochaine(Iterator.scala:149)
à la scala.collection.Itérateur$$anon$2.prochaine(Iterator.scala:745)
à la scala.collection.Itérateur$$anon$2.tête(Iterator.scala:732)
à la scala.collection.Itérateur$$anon$24.hasNext(Iterator.scala:405)
à la scala.collection.Itérateur$$anon de 20$.hasNext(Iterator.scala:320)
à la scala.io.Source.hasNext(Source.scala:209)
à la scala.collection.Itérateur de classe$.foreach(Iterator.scala:534)
à la scala.io.Source.foreach(Source.scala:143)
...
au infillreports.Principal$.principale(Main.scala:8)
au infillreports.Principal.principale(Main.scala)
Java Résultat: 1
Vous devez vous connecter pour publier un commentaire.
J'ai eu du mal avec cette même question et cette réponse m'a aidé. J'ai voulu prolonger sur le commentaire de la seh concernant le " pourquoi cela fonctionne. La réponse doit être sur la signature de la méthode:
Il prend un implict codec paramètre. Pourtant, sur l'exemple, une chaîne est fournie, pas un codec. Une deuxième traduction est de prendre place derrière les coulisses:
Le compagnon objet de la classe Codec définit une méthode appliquer de la Chaîne:
de sorte que le compilateur a fait un peu de travail pour nous:
val lignes = Source.fromFile(unfichier)(Codec("UTF-8"))
Étant donné que le Codec est implicite, si vous appelez cette méthode plusieurs fois, vous pouvez également créer un Codec objet dans le champ d'application de votre appel:
Je l'espère, j'ai eu la bonne (je suis encore un Scala n00b, l'obtention de mes poignées sur elle - n'hésitez pas à corriger si nécessaire)
Codec.apply
n'est pas une conversion implicite, il n'y a aucune raison pour que le compilateur en mode silencieux de l'appeler. En fait, sa estCodec.string2codec
qui est appelé ici (comme est une conversion implicite deString
àCodec
)À ajouter à Daniel C. Sobral réponse, vous pouvez également essayer quelque chose comme cela:
Cela peut être un plus solution générique:
avec les deux paramètres, vous pouvez éviter de données incorrectes dans le fichier.
java.nio.charset.CodingErrorAction