有一个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的编码问题相关推荐

  1. Java18-day09【字节缓冲流、字符流、编码表、字符串与字符流中的编码解码问题、字符流读写数据的方式、字符缓冲流、IO流小结】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

  2. java filereader 示例_J04-Java IO流总结四 《 FileReader和FileWriter 》

    FileReader和FileWriter的源码相对简单,下面通过分析它们的源码以更好地进行理解这两个流 1. FileReader FileReader实现了读取底层的字节数据并将其转换为字符数据的 ...

  3. java io类filereader,39. Java IO: FileReader

    想要查看此教程的目录请点击:Java IO教程目录贴地址 FileReader类(java.io.FileReader),可以基于字符流来读取文件内容.它的工作机制类似于FileInputStream ...

  4. base64编码用在HTML(支持IE6、IE7、IE8)

    在HTML使用base64编码, 叫做Data URI scheme. Data URI scheme目前支持的类型有:(2016-10-19) data:,文本字串 data:text/plain, ...

  5. java filewriter 编码_Java FileWriter 类

    Java FileWriter 类 在本教程中,我们将借助示例学习Java FileWriter及其方法. java.io包的FileWriter类可用于将数据(以字符为单位)写入文件. 它继承了Ou ...

  6. Java日常开发的21个坑,你踩过几个?

    前言 最近看了极客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...

  7. 时间转换竟多出1年!Java开发中的20个坑你遇到过几个?

    前言 最近看了极客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...

  8. 编程中的21个坑,你占几个?

    前言 最近看了某客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...

  9. Java 持久化操作之 --io流与序列化

    摘自:http://www.cnblogs.com/lsy131479/p/8728724.html 1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsol ...

最新文章

  1. sqlserver数据库进行数据和结构比较和同步 Visual Studio2017 数据库架构比较
  2. 单机塔防游戏推荐_电脑高自由度单机游戏推荐
  3. NCEMASLG-32G的说明
  4. 张霖峰:AV1和VVC的格局将在2023年后明朗
  5. Composer - PHP 世界里用于管理项目依赖的工具
  6. 惊呆了! | Spring Boot 使用 @Value 读取配置还能这样用
  7. 【Elasticsearch】es 各种 日志 慢日志 慢查询
  8. 平面直角坐标系中的旋转公式_难点解析丨空间直线、平面平行的判定及其性质...
  9. html生物代码,方舟生存进化生物代码 手游生物指令大全
  10. 通过更改cmake的源码实现使用代理的下载命令
  11. 为何公众号推送会延迟发送_微信公众号客服消息群发和推送功能如何实现?
  12. 高数竞赛、数学建模、算法、计算机专业书籍等亲情大甩卖
  13. 关于51芯片及引脚功能介绍与总结
  14. excel合并多个工作表_如何批量合并Excel文件和工作表 - Excel合并器使用教程
  15. 《Linux篇》超详细安装FinalShell并连接Linux教程
  16. py使用bar绘制堆积/带误差棒柱形图
  17. PHP服务器端API原理及示例(接口开发)
  18. MockWebServer使用指南
  19. c++重写卷积网络的前向计算过程,复现theano的测试结果
  20. “巨无霸”智能手环设计

热门文章

  1. 【索引算法】倒排索引
  2. 1668: 高桥和低桥
  3. python获取每月的最后一天
  4. win10彻底关闭休眠状态(1909以上版本)
  5. ceres学习笔记(四)
  6. 谈谈几种去中心化币币交易所的优缺点
  7. MOSFET开通特性(1)——输入特性
  8. SQL查询语句的使用
  9. 云看板生产管理系统,实时监控网关采集的数据
  10. 智慧景区视频监控方案