Вопрос по – Почему я получаю исключение MalformedInputException из этого кода?

20

Я новичок в Scala, и я хотел написать несколько исходных кодов для себя, чтобы мне стало лучше. Я написал простой объект (с основной записью), чтобы смоделировать "grep". вызов всех файлов текущего каталога. (Я запускаю программу из Eclipse Indigo и в Debian Squeeze):

package com.gmail.bernabe.laurent.scala.tests

import java.io.File

import scala.io.Source

object DealWithFiles {

  def main(args:Array[String]){
    for (result <- grepFilesHere(".*aur.*"))
      println(result)
  }

  private def grepFilesHere(pattern:String):Array[String] = {
    val filesHere = new File(".").listFiles

    def linesOfFile(file:File) =
      Source.fromFile(file).getLines.toList

    for (file <- filesHere;
        if file.isFile
    )
      yield linesOfFile(file)(0)
  }

}

Но я получаю исключение java.nio.charset.MalformedInputException, которое я не могу решить:

Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:260)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:319)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at scala.io.BufferedSource$BufferedLineIterator.hasNext(BufferedSource.scala:67)
at scala.collection.Iterator$class.foreach(Iterator.scala:772)
at scala.io.BufferedSource$BufferedLineIterator.foreach(BufferedSource.scala:43)
at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:48)
at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:130)
at scala.collection.TraversableOnce$class.toList(TraversableOnce.scala:242)
at scala.io.BufferedSource$BufferedLineIterator.toList(BufferedSource.scala:43)
at com.gmail.bernabe.laurent.scala.tests.DealWithFiles$.linesOfFile$1(DealWithFiles.scala:18)
at com.gmail.bernabe.laurent.scala.tests.DealWithFiles$$anonfun$grepFilesHere$2.apply(DealWithFiles.scala:23)
at com.gmail.bernabe.laurent.scala.tests.DealWithFiles$$anonfun$grepFilesHere$2.apply(DealWithFiles.scala:20)
at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(TraversableLike.scala:697)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:34)
at scala.collection.mutable.ArrayOps.foreach(ArrayOps.scala:38)
at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:696)   
at com.gmail.bernabe.laurent.scala.tests.DealWithFiles$.grepFilesHere(DealWithFiles.scala:20)
at com.gmail.bernabe.laurent.scala.tests.DealWithFiles$.main(DealWithFiles.scala:10)
at com.gmail.bernabe.laurent.scala.tests.DealWithFiles.main(DealWithFiles.scala)

Заранее спасибо за помощь :)

Ваш Ответ

2   ответа
26

MalformedInputException выбрасывается, когда последовательность входных байтов недопустима для данной кодировки или последовательность символов ввода не является допустимой шестнадцатиразрядной последовательностью Юникода.

Передать правильную кодировку как параметр вSource.fromFile метод.

Спасибо. Как вы думаете, это потому, что я нахожусь под Debian, который по умолчанию использует кодировку UTF8? Благодарность :). Кроме того, я попытался Source.fromFile (файл, "iso-8859-1"). GetLines.toList, которые удаляют исключение, но на этот раз я все еще не получил ожидаемый результат (строки, содержащие регулярное выражение ". * Aur. * ") loloof64
если вы не предоставитеCharset, JVM принимает локаль по умолчанию и кодировку базовой ОС. Prince John Wesley
Хорошо, большое спасибо : loloof64
0

добавив приведенный ниже фрагмент кода в свой код

import scala.io.Codec
import java.nio.charset.CodingErrorAction


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

Похожие вопросы