• 判断文件的编码格式


    package com.qing.qing.test;

    import org.apache.commons.io.FileUtils;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;

    import org.apache.commons.io.FileUtils;

    public class TestBM {
    public static void main(String[] args) {
    String path = "D:\ytzz\ddd.txt";
    path = "D:\ytzz\ddd - 副本.txt";
    File file = new File(path);
    if(!file.exists()){
    System.out.println("not found");
    return;
    }
    try {
                String type = getFilecharset(new ByteArrayInputStream(FileUtils.readFileToByteArray(file)));
                System.out.println(type);
    byte[] bytes = FileUtils.readFileToByteArray(new File(path));
    System.out.println(new String(bytes,type));
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    //判断编码格式方法
    public static String getFilecharset(ByteArrayInputStream byteArrayInputStream) {
    if (byteArrayInputStream == null) return null;
    String charset = "GBK";
    byte[] first3Bytes = new byte[3];
    try {
    boolean checked = false;
    BufferedInputStream bis = new BufferedInputStream(byteArrayInputStream);
    bis.mark(0);
    int read = bis.read(first3Bytes, 0, 3);
    if (read == -1) {
    return charset; //文件编码为 ANSI
    } else if (first3Bytes[0] == (byte) 0xFF
    && first3Bytes[1] == (byte) 0xFE) {
    charset = "UTF-16LE"; //文件编码为 Unicode
    checked = true;
    } else if (first3Bytes[0] == (byte) 0xFE
    && first3Bytes[1] == (byte) 0xFF) {
    charset = "UTF-16BE"; //文件编码为 Unicode big endian
    checked = true;
    } else if (first3Bytes[0] == (byte) 0xEF
    && first3Bytes[1] == (byte) 0xBB
    && first3Bytes[2] == (byte) 0xBF) {
    charset = "UTF-8"; //文件编码为 UTF-8
    checked = true;
    }
    bis.reset();
    if (!checked) {
    int loc = 0;
    while ((read = bis.read()) != -1) {
    loc++;
    if (read >= 0xF0)
    break;
    if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
    break;
    if (0xC0 <= read && read <= 0xDF) {
    read = bis.read();
    if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
    // (0x80
    // - 0xBF),也可能在GB编码内
    continue;
    else
    break;
    } else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小
    read = bis.read();
    if (0x80 <= read && read <= 0xBF) {
    read = bis.read();
    if (0x80 <= read && read <= 0xBF) {
    charset = "UTF-8";
    break;
    } else
    break;
    } else
    break;
    }
    }
    }
    bis.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    finally {
    try {
    byteArrayInputStream.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    return charset;
    }

    }
  • 相关阅读:
    Ajax学习笔记3种Ajax的实现
    分页学习笔记真分页和假分页实现
    学习笔记链表练习,模仿StringBuilder的山寨版StringBuilder
    学习笔记将Asp.Net网站发布到IIS的四种方法及注意事项
    3D 音频技术产品介绍(1):Iosono the future of spatial audio
    国际顶级语音信号增强工作组:IWAENC(International Workshop on Acoustic Echo and Noise Control)
    转:《欢聚时代(多玩YY)IPO招股书》(概要)
    苏州阔地网络科技有限公司专利分析
    CELT和SILK以及Opus的位分配方法
    ISAC 码流格式
  • 原文地址:https://www.cnblogs.com/shihx/p/13522742.html
Copyright © 2020-2023  润新知