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

Bra*_*ant 11 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码在windows和linux box上工作正常,但是在docker容器里面以二进制格式编写.

Docker容器使用Centos7

Pau*_*Rey 1

也许容器中的语言环境 UTF-8 不存在?

您可以使用以下命令查看正在运行的容器中的当前区域设置cat /etc/locale.conf

如果不是,您可以按照user2915097 发布的 StackOverflow 帖子LANG=en_US.utf8中的说明进行操作:

# 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
Run Code Online (Sandbox Code Playgroud)

来源:如何在 Ubuntu Docker 容器内设置区域设置?/sf/answers/1988420521/

编辑1:

你应该使用InputStreamReader而不是InputStream因为:

  • InputStream用于处理二进制数据
  • InputStreamReader是为了处理文本而设计的

您可以在这里找到更多信息。