转载:https://blog.csdn.net/clementad/article/details/47168573
2015-18-01修改:增加 apache commons io 处理方法。
 
在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。
 
这个标识在Java读取文件的时候,不会被去掉,而且String.trim()也无法删除。如果用readLine()读取第一行存进String里面,这个String的length会比看到的大1,而且第一个字符就是这个BOM。
 
这种情况会造成一些麻烦,比如在读取ini文件的时候,如果想判断第一行是不是以“[”开头就无法正确判断。
 
幸好,Java在读取Unicode文件的时候,会统一把BOM变成“\uFEFF”,这样的话,就可以自己手动解决了(判断后,用substring()或replace()去除掉这个BOM):
  1.  
    if(line.startsWith("\uFEFF")){
  2.  
    //line = line.substring(1);
  3.  
    line = line.replace("\uFEFF", "");
  4.  
    }
 
然而,这种方法并不是完美的,如果生成jar文件在windows下运行,还是有问题。终极的解决方法是使用apache commons io提供的BOMInputStream:
  1.  
    <dependency>
  2.  
    <groupId>commons-io</groupId>
  3.  
    <artifactId>commons-io</artifactId>
  4.  
    <version>2.4</version>
  5.  
    </dependency>

  1.  
    BufferedReader reader = null;
  2.  
    try {
  3.  
    //reader = new BufferedReader(new FileReader(file));
  4.  
     
  5.  
    //使用BOMInputStream自动去除UTF-8中的BOM!!!
  6.  
    reader = new BufferedReader(new InputStreamReader(new BOMInputStream(new FileInputStream(file))));
  7.  
     
  8.  
    String str = null;
  9.  
    //一次读入一行(非空),直到读入null为文件结束
  10.  
    while ((str = reader.readLine()) != null) {
  11.  
    }
 
什么是BOM?
BOM = Byte Order Mark
BOM是Unicode规范中推荐的标记字节顺序的方法。比如说对于UTF-16,如果接收者收到的BOM是FEFF,表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明“我是UTF-8编码”。BOM的UTF-8编码是EF BB BF(用UltraEdit打开文本、切换到16进制可以看到)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
 
所有的BOM在C/C++/Java中都被处理为"\uFEFF"(???貌似不一定。。。),参考:http://www.fileformat.info/info/unicode/char/feff/index.htm
 
Wikipedia关于POM的说明介绍:
 
(原创文章,转载请注明转自Clement-Xu的博客:http://blog.csdn.net/clementad/article/details/47168573

最新文章

  1. golang http服务器跨域问题解决
  2. 自动运维:Ansible -ansible tower
  3. python Tornado(招聘的一个比较经常问到的知识)
  4. SharePoint 2013 开发文档管理字段小记
  5. SQL SERVER数据库的表中修改字段的数据类型后,不能保存
  6. 用JS制作简易选项卡
  7. Spring4 MVC Hibernate4集成 Annotation
  8. oracle OFA
  9. AutoTile 自动拼接(五) 学习与实践
  10. Python 爬虫 爬校花网!!
  11. 第一天 Java语言概述
  12. bootstrap-typeahead 自动补全简单的使用教程
  13. C sharp #001# hello world
  14. 吴裕雄 python 机器学习——分类决策树模型
  15. HMM拓扑与转移模型
  16. freemaker超详细 讲解 配置
  17. ubuntu16.04安装wps
  18. POJ1743 Musical Theme [后缀数组+分组/并查集]
  19. thinkphp Ajax表单提交
  20. IT教程视频

热门文章

  1. 自动化测试使用cookie跳过验证码
  2. 使用siege执行压力测试
  3. xftp和xshell有什么区别
  4. canvas画多边形
  5. css position[转
  6. Codeforces Round #369 (Div. 2)-C Coloring Trees
  7. java里获取uuid
  8. 052 自动将每日的日志增量导入到hive中
  9. 如何安装破解Unity, 以5.6.1为例
  10. python获取公网ip,本地ip及所在国家城市等相关信息收藏