文件字符集更改为docker容器中的二进制文件

时间:2018-05-28 10:32:05

标签: java docker

我有一个应用程序,每小时监听一次外部订阅源,并收到源JSON,这是一个分块传输编码流,feed的监听器将块写入文件,整个流完成后另一个线程解析文件并提取数据。但是现在在编写文件时,即使我在写入时指定了字符集,数据仍以二进制格式写入。

    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机箱上运行正常,但在docker容器内部以二进制格式编写。

Docker容器使用Centos7

2 个答案:

答案 0 :(得分:1)

容器中的语言环境UTF-8可能不存在吗?

您可以使用cat /etc/locale.conf

查看正在运行的容器中的当前区域设置

如果不是LANG=en_US.utf8,您可以按照this StackOverflow post by user2915097的说明进行操作:

# 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
     

来源:如何在Ubuntu Docker容器中设置区域设置? https://stackoverflow.com/a/28406007/3756843

编辑1:

您应该使用InputStreamReader代替InputStream,因为:

  • InputStream用于处理二进制数据
  • InputStreamReader用于处理文字

您可以找到更多信息here

答案 1 :(得分:0)

您可以在dockerfile中尝试此操作

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

它遵循您获得的其他评论的相同想法,但使用码头工人自己的机制。