一、问题描述:
在用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();
}
}