如何解决Scala 2.8.0中的java.nio.charset.UnmappableCharacterException?

时间:2009-11-18 16:31:47

标签: exception scala

我正在使用Scala 2.8.0并尝试读取管道分隔文件,如下面的代码所示:

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)
    }
  }
}

这是错误:

线程“main”中的异常java.nio.charset.UnmappableCharacterException:输入长度= 1         at java.nio.charset.CoderResult.throwException(CoderResult.java:261)         at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:319)         at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)         在java.io.InputStreamReader.read(InputStreamReader.java:167)         在java.io.BufferedReader.fill(BufferedReader.java:136)         在java.io.BufferedReader.read(BufferedReader.java:157)         在scala.io.BufferedSource $$ anonfun $ 1 $$ anonfun $ apply $ 1.apply(BufferedSource.scala:29)         在scala.io.BufferedSource $$ anonfun $ 1 $$ anonfun $ apply $ 1.apply(BufferedSource.scala:29)         在scala.io.Codec.wrap(Codec.scala:65)         在scala.io.BufferedSource $$ anonfun $ 1.apply(BufferedSource.scala:29)         在scala.io.BufferedSource $$ anonfun $ 1.apply(BufferedSource.scala:29)         在scala.collection.Iterator $$ anon $ 14.next(Iterator.scala:149)         在scala.collection.Iterator $$ anon $ 2.next(Iterator.scala:745)         在scala.collection.Iterator $$ anon $ 2.head(Iterator.scala:732)         在scala.collection.Iterator $$ anon $ 24.hasNext(Iterator.scala:405)         在scala.collection.Iterator $$ anon $ 20.hasNext(Iterator.scala:320)         在scala.io.Source.hasNext(Source.scala:209)         在scala.collection.Iterator $ class.foreach(Iterator.scala:534)         在scala.io.Source.foreach(Source.scala:143) ... 在infillreports.Main $ .main(Main.scala:8)         在infillreports.Main.main(Main.scala) Java结果:1

4 个答案:

答案 0 :(得分:24)

object Main {
  def main(args: Array[String]) :Unit = {
    if (args.length > 0) {
      val lines = scala.io.Source.fromPath("QUICK!LRU-2009-11-15.psv")("UTF-8")
      for (line <-lines)
        print(line)
    }
  }
}

答案 1 :(得分:7)

我正在努力解决同样的问题,这个答案对我有所帮助。我想延伸seh关于'为什么这样有效'的评论。答案应该在方法签名上:

def fromFile(file: JFile)(implicit codec: Codec): BufferedSource

它需要一个implict编解码器参数。然而,在该示例中,提供了字符串,而不是编解码器。第二个翻译是在幕后进行的: Codec类的伴随对象从String:

定义apply方法
def apply(encoding: String): Codec

所以编译器为我们做了一些工作: val lines = Source.fromFile(someFile)(Codec(“UTF-8”))

鉴于Codec是隐式的,如果您多次调用此方法,您还可以在调用范围内创建Codec对象:

implicit val codec = Codec("UTF-8")
val lines = Source.fromFile(someFile)
val moreLines = Source.fromFile(someOtherFile)

我希望我做对了(我仍然是Scala n00b,抓住它 - 随时根据需要纠正)

答案 2 :(得分:4)

要添加Daniel C. Sobral的答案,您还可以尝试这样的事情:

val products = Source.fromFile("products.txt")("UTF-8").getLines().toList;

for(p <- products){
        println("product :" + p);
}

答案 3 :(得分:1)

这可能是一个更通用的解决方案:

implicit val codec = Codec("UTF-8")
codec.onMalformedInput(CodingErrorAction.REPLACE)
codec.onUnmappableCharacter(CodingErrorAction.REPLACE)

使用这两个设置,可以避免文件中格式错误的数据。