读取xml格式utf-8编码 和utf-8 无bom编码格式,出现 前言中不允许有内容的问题

1,java 读取 xml utf-8 编码格式的文件,出现  Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。

    出现这样的原因, 是因为读取文件过程中,出现了格式转化问题,在代码中,需要进行转化处理. 对utf-8编码格式或者utf-8 无bom编码格式,要有对应的读取处理.


步骤一: 

       先进行封装一个java类. 这个类的主要作用是 对 utf8 编码格式进行处理,在首行 添加 bom 格式相关信息,大约三个字节.

  package com.sdzx.controller;


import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;


public class UnicodeInputStream extends InputStream {
    PushbackInputStream internalIn;
    boolean             isInited = false;
    String              defaultEnc;
    String              encoding;


     private static final int BOM_SIZE = 4;


     public UnicodeInputStream(InputStream in, String defaultEnc) {
         internalIn = new PushbackInputStream(in, BOM_SIZE);
         this.defaultEnc = defaultEnc;
     }


     public String getDefaultEncoding() {
       return defaultEnc;
    }


    public String getEncoding() {
       if (!isInited) {
          try {
             init();
          } catch (IOException ex) {
             IllegalStateException ise = new IllegalStateException("Init method failed.");
             ise.initCause(ise);
             throw ise;
          }
       }
       return encoding;
    }


    /**
     * Read-ahead four bytes and check for BOM marks. Extra bytes are
     * unread back to the stream, only BOM bytes are skipped.
     */
    protected void init() throws IOException {
       if (isInited) return;


       byte bom[] = new byte[BOM_SIZE];
       int n, unread;
       n = internalIn.read(bom, 0, bom.length);


       if ( (bom[0] == (byte)0x00) && (bom[1] == (byte)0x00) &&
                   (bom[2] == (byte)0xFE) && (bom[3] == (byte)0xFF) ) {
          encoding = "UTF-32BE";
          unread = n - 4;
       } else if ( (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) &&
                   (bom[2] == (byte)0x00) && (bom[3] == (byte)0x00) ) {
          encoding = "UTF-32LE";
          unread = n - 4;
       } else if (  (bom[0] == (byte)0xEF) && (bom[1] == (byte)0xBB) &&
             (bom[2] == (byte)0xBF) ) {
          encoding = "UTF-8";
          unread = n - 3;
       } else if ( (bom[0] == (byte)0xFE) && (bom[1] == (byte)0xFF) ) {
          encoding = "UTF-16BE";
          unread = n - 2;
       } else if ( (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) ) {
          encoding = "UTF-16LE";
          unread = n - 2;
       } else {
          // Unicode BOM mark not found, unread all bytes
          encoding = defaultEnc;
          unread = n;
       }      
       //System.out.println("read=" + n + ", unread=" + unread);


       if (unread > 0) internalIn.unread(bom, (n - unread), unread);


       isInited = true;
    }


    public void close() throws IOException {
       //init();
       isInited = true;
       internalIn.close();
    }


    public int read() throws IOException {
       //init();
       isInited = true;
       return internalIn.read();
    }
 }




步骤二:    采用以下读取xml文件处理.

           /**

             // URL 参数,如果以http开始,就用http://+"文件绝对路径" ,如果是本地文件,则要用ftp:/// +"文件绝对路径" 开头

          */

         URL url = new URL("http://****/***/test.txt");    

    // File f  = new File("test.txt");  

        String enc = null; // or NULL to use systemdefault
        UnicodeInputStream uin = new UnicodeInputStream(url.openStream(),enc);  //如果是本地将url.openStream -> new FileInputStream(f)
        enc = uin.getEncoding(); // check and skip possible BOM bytes
        InputStreamReader in;
        if (enc == null){
            in = new InputStreamReader(uin);
        }else {
            in = new InputStreamReader(uin, enc);
        }
        BufferedReader reader = new BufferedReader(in);
        //BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("D:/tags.txt"),"utf-8"));
        String tmp =reader.readLine();

这样读取的结果就是正常的了, 


  以上  : 转载于    https://www.cnblogs.com/xifenglou/p/6233689.html           



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值