在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。
这个标识在Java读取文件的时候,不会被去掉,而且String.trim()也无法删除。如果用readLine()读取第一行存进String里面,这个String的length会比看到的大1,而且第一个字符就是这个BOM。
这种情况会造成一些麻烦,比如在读取ini文件的时候,如果想判断第一行是不是以“[”开头就无法正确判断。
幸好,Java在读取Unicode文件的时候,会统一把BOM变成“\uFEFF”,这样的话,就可以自己手动解决了(判断后,用substring()或replace()去除掉这个BOM): [java]view plaincopy
  1. if(line.startsWith("\uFEFF")){
  2. //line=line.substring(1);
  3. line=line.replace("\uFEFF","");
  4. }

然而,这种方法并不是完美的,如果生成jar文件在windows下运行,还是有问题。终极的解决方法是使用apache commons io提供的BOMInputStream: [html]view plaincopy
  1. <dependency>
  2. <groupId>commons-io</groupId>
  3. <artifactId>commons-io</artifactId>
  4. <version>2.4</version>
  5. </dependency>

[java]view plaincopy
  1. BufferedReaderreader=null;
  2. try{
  3. //reader=newBufferedReader(newFileReader(file));
  4. //使用BOMInputStream自动去除UTF-8中的BOM!!!
  5. reader=newBufferedReader(newInputStreamReader(newBOMInputStream(newFileInputStream(file))));
  6. Stringstr=null;
  7. //一次读入一行(非空),直到读入null为文件结束
  8. while((str=reader.readLine())!=null){
  9. }

什么是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编码了。 文章转自:http://blog.csdn.net/clementad/article/details/47168573

更多相关文章

  1. 包含带标记的值的XML属性文件
  2. 使用Maven时,不要将JAR添加到Google Cloud上的暂存文件夹中
  3. Java jasypt对.properties配置文件密码加密
  4. Java调用gc机制强制删除文件
  5. 将日期保存到序列化文件
  6. 新手求教RandomAccessFile读写文件到底写入的是什么?
  7. Java逐行读写TXT文件
  8. 帮忙解析一下 java解析普通的文本文件,提取信息到execl文件中
  9. 如何从java获取spring配置文件名称

随机推荐

  1. android studio 错误总结
  2. Android SQLiteOpenHelper
  3. Android Custom Views and XML attribute
  4. Android获取/清除应用数据
  5. Android SDK R14 发布
  6. 如何提高android代码质量
  7. android中的颜色值
  8. 在android中玩转wcf
  9. Android入门教程(九)之-----取得手机屏幕
  10. android 监听电源键