Изменения кодировки файла в двоичном виде в контейнере докеров

У меня есть приложение, которое ежечасно слушает внешнюю подачу и получает канал JSON, который является потоком кодирования передаваемого канала, слушатель в канал записывает кусок в файл, после того как весь поток завершен, другой поток анализирует файл и извлекает данные. Но теперь, когда вы пишете файл, данные записываются в двоичном формате, даже если я указал кодировку во время записи.

    public void writeToFile(InputStream in){
     File feedFile = new File("/tmp/feed.json");
    try {
        FileUtils.touch(feedFile);
        StringWriter writer = new StringWriter();
        IOUtils.copy(in, writer, StandardCharsets.UTF_8);
        FileUtils.write(feedFile, writer.toString(), StandardCharsets.UTF_8,true);

    } catch (IOException e) {
        logger.error(Constants.FAILED_TO_WRITE_FEED_INTO_FILE,e);
    }
}

Этот код отлично работает на windows и linux box, но в то время как внутри контейнера докера он написан в двоичном формате.

Контейнер-докерер использованный Centos7

Ответ 1

Может быть, локаль UTF-8 в контейнере не существует?

Вы можете увидеть текущую локаль в вашем запущенном контейнере с cat/etc/locale.conf

Если это не LANG=en_US.utf8, вы можете следовать инструкции из fooobar.com/questions/171237/...:

# Set the locale
RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    locale-gen
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8

Источник: Как установить локаль внутри контейнера Docker Ubuntu? fooobar.com/questions/171237/...

ИЗМЕНИТЬ 1:

Вы должны использовать InputStreamReader вместо InputStream потому что:

  • InputStream предназначен для обработки двоичных данных
  • InputStreamReader предназначен для обработки текста

Вы можете найти более подробную информацию здесь.

Ответ 2

Вы можете попробовать это в своем файле докеров

ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

Он следует той же идее других комментариев, которые вы получили, но использует собственный механизм докеров.