FileReader的编码问题
有一个UTF-8编码的文本文件,用FileReader读取到一个字符串,然后转换字符集:str=new String(str.getBytes(),"UTF-8");结果大部分中文显示正常,但最后仍有部分汉字显示为问号!
public static List<String> getLines( String fileName ) { List<String> lines = new ArrayList<String>(); try { BufferedReader br = new BufferedReader(new FileReader(fileName)); String line = null; while( ( line = br.readLine() ) != null ) lines.add(new String(line.getBytes("GBK"), "UTF-8")); br.close(); } catch( FileNotFoundException e ) { } catch( IOException e ) { } return lines; }
文件读入时是按OS的默认字符集即GBK解码的,我先用默认字符集GBK编码str.getBytes(“GBK”),此时应该还原为文件中的字节序列了,然后再按UTF-8解码,生成的字符串按理说应该就应该是正确的。
为什么结果中还是有部分乱码呢?
问题出在FileReader读取文件的过程中,FileReader继承了InputStreamReader,但并没有实现父类中带字符集参数的构造函数,所以FileReader只能按系统默认的字符集来解码,然后在UTF-8 -> GBK -> UTF-8的过程中编码出现损失,造成结果不能还原最初的字符。
原因明确了,用InputStreamReader代替FileReader,InputStreamReader isr=new InputStreamReader(new FileInputStream(fileName),"UTF-8");这样读取文件就会直接用UTF-8解码,不用再做编码转换。
public static List<String> getLines( String fileName ) { List<String> lines = new ArrayList<String>(); try { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8")); String line = null; while( ( line = br.readLine() ) != null ) lines.add(line); br.close(); } catch( FileNotFoundException e ) { } catch( IOException e ) { } return lines; }
FileReader的编码问题相关推荐
- Java18-day09【字节缓冲流、字符流、编码表、字符串与字符流中的编码解码问题、字符流读写数据的方式、字符缓冲流、IO流小结】
视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java ...
- java filereader 示例_J04-Java IO流总结四 《 FileReader和FileWriter 》
FileReader和FileWriter的源码相对简单,下面通过分析它们的源码以更好地进行理解这两个流 1. FileReader FileReader实现了读取底层的字节数据并将其转换为字符数据的 ...
- java io类filereader,39. Java IO: FileReader
想要查看此教程的目录请点击:Java IO教程目录贴地址 FileReader类(java.io.FileReader),可以基于字符流来读取文件内容.它的工作机制类似于FileInputStream ...
- base64编码用在HTML(支持IE6、IE7、IE8)
在HTML使用base64编码, 叫做Data URI scheme. Data URI scheme目前支持的类型有:(2016-10-19) data:,文本字串 data:text/plain, ...
- java filewriter 编码_Java FileWriter 类
Java FileWriter 类 在本教程中,我们将借助示例学习Java FileWriter及其方法. java.io包的FileWriter类可用于将数据(以字符为单位)写入文件. 它继承了Ou ...
- Java日常开发的21个坑,你踩过几个?
前言 最近看了极客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...
- 时间转换竟多出1年!Java开发中的20个坑你遇到过几个?
前言 最近看了极客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...
- 编程中的21个坑,你占几个?
前言 最近看了某客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...
- Java 持久化操作之 --io流与序列化
摘自:http://www.cnblogs.com/lsy131479/p/8728724.html 1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsol ...
最新文章
- sqlserver数据库进行数据和结构比较和同步 Visual Studio2017 数据库架构比较
- 单机塔防游戏推荐_电脑高自由度单机游戏推荐
- NCEMASLG-32G的说明
- 张霖峰:AV1和VVC的格局将在2023年后明朗
- Composer - PHP 世界里用于管理项目依赖的工具
- 惊呆了! | Spring Boot 使用 @Value 读取配置还能这样用
- 【Elasticsearch】es 各种 日志 慢日志 慢查询
- 平面直角坐标系中的旋转公式_难点解析丨空间直线、平面平行的判定及其性质...
- html生物代码,方舟生存进化生物代码 手游生物指令大全
- 通过更改cmake的源码实现使用代理的下载命令
- 为何公众号推送会延迟发送_微信公众号客服消息群发和推送功能如何实现?
- 高数竞赛、数学建模、算法、计算机专业书籍等亲情大甩卖
- 关于51芯片及引脚功能介绍与总结
- excel合并多个工作表_如何批量合并Excel文件和工作表 - Excel合并器使用教程
- 《Linux篇》超详细安装FinalShell并连接Linux教程
- py使用bar绘制堆积/带误差棒柱形图
- PHP服务器端API原理及示例(接口开发)
- MockWebServer使用指南
- c++重写卷积网络的前向计算过程,复现theano的测试结果
- “巨无霸”智能手环设计