Flink通过ParameterTool读取文件中文乱码

一、问题描述:

在用ParameterTool获取参数时,会出现中文乱码的问题。如下获取ParameterTool的方法getParameterTool:

测试代码:

 public static void main(String[] args) {
 		String propertiesPath = args[0]; //第一个参数为配置文件
        ParameterTool parameterTool = ParameterTool.fromPropertiesFile("src/main/resources/test.properties");
        System.out.println(parameterTool.get("name"));
}

二、问题原因:

查看ParameterTool源码发现最终读取文件的操作为InputStream,因为这里的参数InputStream是文件的字节流,而中文转成字节流时可能会出现乱码的问题。
在这里插入图片描述

为了解决这个问题,将字节流转成字符流InputStreamReader,此处最好指定编码格式,不要用默认字符集。

props.load(new InputStreamReader(fileRource.getInputStream(), “UTF-8”));

源码里关于InputStreamReader的介绍:An InputStreamReader is a bridge from byte streams to character streams.Creates a buffering character-input stream that uses a default-sized.

最后,Properties加载这个字符流,再通过ParameterTool.fromMap方法创建ParameterTool。

三、解决方案:

public static void main(String[] args) throws Exception {
    ParameterTool propertiesargs = ParameterTool.fromArgs(args);    
    String fileName = propertiesargs.get("http_conf_path");
    //从hdfs获取动态参数配置文件
//    org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
//    org.apache.hadoop.fs.FileSystem fs = org.apache.hadoop.fs.FileSystem.get(URI.create(fileName), conf);
//    InputStream wrappedStream = fs.open(new Path(fileName)).getWrappedStream();
//    //防止中文乱码
//    Properties props = new Properties();
//    BufferedReader bf = new BufferedReader(new InputStreamReader(wrappedStream,"UTF-8"));
//    props.load(bf);
//    ParameterTool parameters = ParameterTool.fromMap((Map) props);

    //从本地文件获取动态参数配置文件
    ParameterTool parameters = null;
    try {
        Properties props = new Properties();
        InputStream inputStream = new FileInputStream(fileName);
        BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));
        props.load(bf);
        parameters = ParameterTool.fromMap((Map) props);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值