我正在使用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
答案 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)
使用这两个设置,可以避免文件中格式错误的数据。