Как пропустить недопустимые символы в потоке в Java / Scala? - PullRequest
19 голосов
/ 02 сентября 2011

Например, у меня есть следующий код

Source.fromFile(new File( path), "UTF-8").getLines()

и выдает исключение

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)

Мне все равно, если некоторые строки не были прочитаны, но как пропустить неверные символы и продолжить чтение строк?

Ответы [ 4 ]

33 голосов
/ 02 сентября 2011

Вы можете повлиять на то, как декодирование кодировки обрабатывает неверный ввод, вызвав CharsetDecoder.onMalformedInput.

Обычно вы никогда не увидите CharsetDecoderобъект непосредственно, потому что он будет создан за кулисами для вас.Поэтому, если вам нужен доступ к нему, вам нужно будет использовать API, который позволяет указывать CharsetDecoder напрямую (вместо только имени кодировки или Charset).

Самый простой примертаким API является InputStreamReader:

InputStream in = ...;
CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
decoder.onMalformedInput(CodingErrorAction.IGNORE);
Reader reader = new InputStreamReader(in, decoder);

Обратите внимание, что этот код использует класс Java 7 StandardCharsets, для более ранних версий вы можете просто заменить егос Charset.forName("UTF-8") (или используйте Charsets класс из Гуава ).

13 голосов
/ 02 сентября 2011

Ну, если это не UTF-8, это что-то еще. Хитрость заключается в том, чтобы выяснить, что это за что-то еще, но если все, что вам нужно, это избежать ошибок, вы можете использовать кодировку, в которой нет недопустимых кодов, например latin1:

Source.fromFile(new File( path), "latin1").getLines()
1 голос
/ 14 августа 2013

У меня была похожая проблема, и один из встроенных кодеков Scala помог мне:

Source.fromFile(new File(path))(Codec.ISO8859).getLines()
0 голосов
/ 19 июля 2015

Если вы хотите избежать использования недопустимых символов в Scala, я обнаружил, что это работает для меня.

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

object HelloWorld {

  def main(args: Array[String]) = {
    implicit val codec = Codec("UTF-8")

    codec.onMalformedInput(CodingErrorAction.REPLACE)
    codec.onUnmappableCharacter(CodingErrorAction.REPLACE)

    val dataSource = Source.fromURL("https://www.foo.com")

    for (line <- dataSource.getLines) {

      println(line)
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...