您的位置:首页 > 编程语言 > Java开发

java读取UTF-8文本文件第一个字符多出一个问号解决方法

2017-10-24 11:20 501 查看
1.创建工具类

[java] view
plain copy

import java.io.*;  

  

public class UnicodeReader extends Reader {  

  PushbackInputStream internalIn;  

  InputStreamReader   internalIn2 = null;  

  String              defaultEnc;  

  

  private static final int BOM_SIZE = 4;  

  

    

  UnicodeReader(InputStream in, String defaultEnc) {  

     internalIn = new PushbackInputStream(in, BOM_SIZE);  

     this.defaultEnc = defaultEnc;  

  }  

  

  public String getDefaultEncoding() {  

     return defaultEnc;  

  }  

  

    

  public String getEncoding() {  

     if (internalIn2 == null) return null;  

     return internalIn2.getEncoding();  

  }  

  

    

  protected void init() throws IOException {  

     if (internalIn2 != null) return;  

  

     String encoding;  

     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);  

  

     // Use given encoding  

     if (encoding == null) {  

        internalIn2 = new InputStreamReader(internalIn);  

     } else {  

        internalIn2 = new InputStreamReader(internalIn, encoding);  

     }  

  }  

  

  public void close() throws IOException {  

     init();  

     internalIn2.close();  

  }  

  

  public int read(char[] cbuf, int off, int len) throws IOException {  

     init();  

     return internalIn2.read(cbuf, off, len);  

  }  

  

}  

2.使用工具类读取文件

[java] view
plain copy

BufferedReader br = new BufferedReader(  

     new UnicodeReader(  

     new FileInputStream(sqlFile),   

     Charset.defaultCharset().name()));   

3.出现有问号的编写

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

        FileInputStream in = new FileInputStream(f);  

        // 指定读取文件时以UTF-8的格式读取  

        BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));  

          

        String line = br.readLine();  

        while(line != null)  

        {  

            System.out.println(line);  

            line = br.readLine();  

        }  

只需编写工具类,将new InputStreamReader(in, "UTF-8")替换成

new UnicodeReader(new FileInputStream(sqlFile),Charset.defaultCharset().name())就可以解决该问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐