我有一个应用程序,每小时监听一次外部订阅源,并收到源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
答案 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
它遵循您获得的其他评论的相同想法,但使用码头工人自己的机制。