JAVA读(FileReader)或写(FileWriter)包含中文的文件乱码问题

阐述一下背景:

我曾经写的一个jar的任务,是用spark去处理hive数据;已经在若干个服务器上调度都是很正常的,但是有一天在3个场地爆出,运行失败的问题;然后自己就去看日志追问题,在日志上看到到了中文乱码。所以基本锁定是编码问题。因为的任务里面有一个验证环节:1.任务本地存储一个json配置文件;2.spark拉取分布式数据的统计信息;3.如果1中的key在2中则进行跑数;

问题判定:

日志显示,验证环节失败了。所以可以肯定的是,不是spark读的数据是乱码,就是我的本地配置读的时候是乱码。

问题排查:

1.我写死了一个spark的hiveSQL,即不用本地配置读的key,然后去跑数,发现正常;
2.所以我们可以锁定问题出在了java在读本地配置的时候,配置是乱码了。
3.乱码的特点,部分中文乱码,数字和字母没问题;

问题断定:

原因:通过上述的排查,基本可定,java在读取的配置的时候,编码形式肯定有问题,导致中文乱码。

代码位置:
代码里面读配置的程序如下:
reader = new BufferedReader(new FileReader(file));
所以,一步一步发现原来是FileReader的问题;

乱码分析:

FileReader内部没有设置指定编码的参数,只能使用ISO-8859-1 or US-ASCII的西方编码。所以问题找到了就是这里。
替换方案:

InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(filePath)), “UTF-8”);
BufferedReader br = new BufferedReader(isr);

扩展:

我发现既然读有问题,是不是写也有问题,因为我的写用了FileWriter,测试一下,咦果然也有问题;
所以FileWriter写的部分需要替换成,如下:
BufferedWriter writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (filePath,true),“UTF-8”));

参考资料:

Java FileWriter无法编码utf-8 转换方法
https://blog.csdn.net/liyuxing6639801/article/details/69487712

FileReader读取中文字符乱码问题
https://blog.csdn.net/wjw521wjw521/article/details/72831704

JAVA基础知识之InputStreamReader流
https://blog.csdn.net/ai_bao_zi/article/details/81133476

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值