文档章节

java 读取包含[BOM]位的UTF-8文件

-_-lll
 -_-lll
发布于 2016/09/05 18:20
字数 368
阅读 59
收藏 0

最近在做一个数据共享的项目,在读取UTF-8编码的文件时出现些问题,现记录如下。

UTF-8编码的文件在读取时要格外注意,看其文件开头是否包含[BOM]位。 这个字符一般用来判断该文件是否为UTF-8编码,但Java读取时也会将该判断位一同读出,导致读取的数据与预期不一致。

解决方法如下

import java.io.*;
public class Test1 {
   /** 定义BufferReader */
   public static BufferedReader  openTextFileR(
                        String fileName
                       ,String charSet
                       )throws Exception{
      return new BufferedReader(
                 new InputStreamReader(
                     skipUTF8BOM(
                        new FileInputStream(
                            new File(fileName))
                       ,charSet)
                    ,charSet));
      }
   /** 跳过[BOM]位 */
   public static InputStream skipUTF8BOM(
                        InputStream is
                       ,String      charSet
                        )throws Exception{
      if( !charSet.toUpperCase().equals("UTF-8") ) return is;
      if( !is.markSupported() ){
         //   如果输入流不支持mark功能时,用BufferedInputStream替换InputStream
         is= new BufferedInputStream(is);
         }
      is.mark(3); // 标记先头三位
      if( is.available()>=3 ){
         byte b[]={0,0,0};
         is.read(b,0,3);
         if( b[0]!=(byte)0xEF ||
             b[1]!=(byte)0xBB ||
             b[2]!=(byte)0xBF ){
            is.reset();// 如果文件不含有[BOM]位时,将文件指针复位
            }
         }
      return is;
      }
   public static void main(String[] args_){
      try{
         String         line;
         BufferedReader br;
         // 无[BOM]处理
         br = new BufferedReader(new InputStreamReader(
                                    new FileInputStream(
                                         new File(args_[0]))
                                   ,"utf-8"));
         while( (line=br.readLine())!=null ) System.out.println(line);
         br= new BufferedReader(new InputStreamReader(
                                    new FileInputStream(
                                         new File(args_[1]))
                                   ,"utf-8"));
         while( (line=br.readLine())!=null ) System.out.println(line);
         // 有[BOM]处理
         br= openTextFileR(args_[0],"utf-8");
         while( (line=br.readLine())!=null ) System.out.println(line);
         br= openTextFileR(args_[1],"utf-8");
         while( (line=br.readLine())!=null ) System.out.println(line);
         }
      catch(Exception e){
         e.printStackTrace(System.err);
         }
      }
   }

© 著作权归作者所有

共有 人打赏支持
-_-lll
粉丝 2
博文 1
码字总数 368
作品 0
日本
程序员
私信 提问
Java读带有BOM的UTF-8文件乱码原因及解决方法

最近在处理文件时发现了同样类型的文件使用的编码可能是不同的。所以想将文件的格式统一一下(因为UTF-8的通用性,决定往UTF-8统一),遇见的第一个问题是:如何查看现有文件的编码方式。 上网...

张志浩
2012/11/06
0
0
Win10系统下eclipse的基本配置 编码格式 classpath原理 import工作机制

eclipse是用来编译java文件的一个软件 国内也有汉化版,我也不知道该怎么上传……忘了从哪里搞来了 不过用了一段时间就还原原来的配置了因为网上的教程之类的方法都是英文版的 为了和网上的配...

codingcoge
2018/03/17
0
0
Java处理文件BOM头的方式推荐

背景: java普通的文件读取方式对于bom是无法正常识别的。 使用普通的InputStreamReader,如果采用的编码正确,那么可以获得正确的字符,但bom仍然附带在结果中,很容易导致数据处理出错。 ...

littleatp
2015/03/28
0
0
Idea 导入 MyEclipse项目 错误 Error:(1, 1) java: 非法字符: \65279

在用idea导入myeclipse导过的项目时,报错 Error:(1, 1) java: 非法字符: 65279 Error:(1, 10) java: 需要class, interface或enum 网上找的的产生原因: IntelliJ IDEA对设置为“UTF-8”编码...

小海bug
2018/12/07
0
0
ContentType,charset和pageEncoding的区别

ContentType 属性指定响应的 HTTP 内容类型。如果未指定 ContentType,默认为 text/HTML。   语法  Response.ContentType [= ContentType ]   参数   ContentType pageEncoding是jsp...

Glogo
2013/02/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
今天
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
2
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
12
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部