Source.fromResource() работает локально, но выдает java.nio.charset.MalformedInputException на сервере

Я использую этот код для чтения ресурса:

  val source = Source.fromResource(pathWithoutSlash)
  val lines:Seq[String] = (for (l <- source.getLines() if ! l.trim.isEmpty) yield l.trim).toList

Этот код отлично работает, когда я запускаю его локально, но на сервере он не работает:

Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
    at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:185)
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
    at scala.io.BufferedSource$BufferedLineIterator.hasNext(BufferedSource.scala:70)

Я предполагаю, что это потому, что файл содержит некоторые символы с диакритическими знаками, например: éclair's , и, вероятно, кодировка по умолчанию, используемая на сервере, отличается от той, что у меня есть локально.

Мой вопрос: как я могу изменить кодировку на сервере, чтобы она соответствовала тому, что у меня есть локально (и как я могу проверить, что у меня есть локально)?

Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
368
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы предположил, что неявное значение Codec, которое вы можете увидеть с помощью

println(implicitly[scala.io.Codec])

отличается на вашем сервере. Если я правильно понял, он должен оцениваться как scala.io.Codec.fallbackSystemCodec. Просто передайте соответствующий Codec явно (метод fromResource принимает неявный Codec во втором списке параметров), например:

val source = Source.fromResource(pathWithoutSlash)(Codec.UTF8)

Любые идеи, как можно изменить резервный системный кодек? Есть ли настройка jvm?

Ali 14.04.2019 07:26

@ClickUpvote Судя по коду, это выглядит так, как будто это оболочка вокруг java.nio.charset.Charset.defaultCharset(). Может быть, здесь что-то полезное.

Andrey Tyukin 14.04.2019 12:01

Другие вопросы по теме