今天进行csv文件读取时,老是入库为空,因为其中有中文字符,我要通过中文字符映射成相应的编号(上升:1011,下降:1012),于是怎么也取不到编号.刚开始以为程序映射出了问题,最后日志打出来后,发现读取的csv文件内容中文全为乱码.啊啊啊,好坑.于是看了下别人写的读取csv文件的代码,果然是没有设置字符编码.通过字符读取文件,转为字节流一定要进行字符编码设置,否则跑到测试环境或生产环境会使用本地默认字符集,那就坑大了.

  问题代码:

BufferedReader in = new BufferedReader(new FileReader(this.inputCsvFile));

  解决方式:

BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(this.inputCsvFile), "UTF-8"));

就这两行不同的代码却有着不同的效果,神奇吧.

接下来我就说一说原理,我觉得人家说的挺好,于是就引用人家说的.

Java的I/O类处理如图:

Reader 类是 Java 的 I/O 中读字符的父类,而 InputStream 类是读字节的父类,InputStreamReader 类就是关联字节到字符的桥梁,它负责在 I/O 过程中处理读取字节到字符的转换,而具体字节到字符的解码实现它由 StreamDecoder 去实现,在 StreamDecoder 解码过程中必须由用户指定 Charset 编码格式。值得注意的是如果你没有指定 Charset,将使用本地环境中的默认字符集,例如在中文环境中将使用 GBK 编码。

Java的I/O类处理图

总结:Java读取数据流的时候,一定要指定数据流的编码方式,否则将使用本地环境中的默认字符集。

参考链接:

https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

http://sd8089730.iteye.com/blog/1290895

http://blog.csdn.net/greenqingqingws/article/details/7395213

 

最新文章

  1. 全面分析 Spring 的编程式事务管理及声明式事务管理
  2. MSP430 IO 使用
  3. ionic tabs置顶
  4. 杭电acm 1001
  5. 网上图书商城1--User模块
  6. 简洁的drag效果,自由拖拽div的实现及注意点
  7. Redis源码研究--双向链表
  8. Daject初探 - 一个开源关系型数据库对象关系映射(ORM)模型
  9. Suse系统用户不能登录报错
  10. ubuntu下openGL的配置方法
  11. 更新xcode后插件失效问题——不针对特定版本的通用解决方法
  12. PowerPoint超链接字体颜色修改、怎么去掉超链接下划线
  13. Docker学习——pinpoint部署
  14. idea avtiviti 插件中文乱码
  15. Mysql 密码过期
  16. Delphi编写Shell扩展
  17. ViewPager源码分析——滑动切换页面处理过程
  18. em和px比较
  19. ant编译apache-nutch-2.2.1结合mysql实现爬虫的安装配置全过程
  20. javascript代码

热门文章

  1. C++中没有定义类的引用。
  2. 在SDL中显示GBK点阵汉字
  3. Android开发系列之系统源码目录
  4. TouchSlide - 大话主席
  5. quartus2 13.0+modelsim联合开发环境搭建(win10)
  6. [译]GLUT教程 - 整合代码1
  7. UVA-11625-Nice Prefixes (DP+矩阵快速幂)
  8. golang struct 定义中json``解析说明
  9. shell遍历文件目录,监听文件变化,拼接字符串
  10. WPF 自定义快捷键命令(COMMAND)(转)