近来碰到需要判断文件的编码格式,根据编码格式读取文件,网上百度了好几种方法,遂分享一下。

1.通过文件的前三个字节判断(可用,但据百度说正确率不高):

public static String codeString(String fileName) throws Exception {BufferedInputStream bin = new BufferedInputStream(new FileInputStream(fileName));int p = (bin.read() << 8) + bin.read();bin.close();String code = null;switch (p) {case 0xefbb:code = "UTF-8";break;case 0xfffe:code = "Unicode";break;case 0xfeff:code = "UTF-16BE";break;default:code = "GBK";}return code;}

2.进一步读取文件的字段,进行特殊编码字符的判断来确定文件编码:

public static String charset(String path) {String charset = "GBK";byte[] first3Bytes = new byte[3];try {boolean checked = false;BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));bis.mark(0); // 读者注: bis.mark(0);修改为 bis.mark(100);我用过这段代码,需要修改上面标出的地方。 // Wagsn注:不过暂时使用正常,遂不改之int read = bis.read(first3Bytes, 0, 3);if (read == -1) {bis.close();return charset; // 文件编码为 ANSI} else if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {charset = "UTF-16LE"; // 文件编码为 Unicodechecked = true;} else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF) {charset = "UTF-16BE"; // 文件编码为 Unicode big endianchecked = true;} else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB&& first3Bytes[2] == (byte) 0xBF) {charset = "UTF-8"; // 文件编码为 UTF-8checked = true;}bis.reset();if (!checked) {while ((read = bis.read()) != -1) {if (read >= 0xF0)break;if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBKbreak;if (0xC0 <= read && read <= 0xDF) {read = bis.read();if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)// (0x80 - 0xBF),也可能在GB编码内continue;elsebreak;} 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;} elsebreak;} elsebreak;}}}bis.close();} catch (Exception e) {e.printStackTrace();}System.out.println("--文件-> [" + path + "] 采用的字符集为: [" + charset + "]");return charset;}

3.通过使用开源项目判断(项目名:cpdetector_1.0.10_binary.zip):

public static String getFileCharset(String filePath) throws Exception {CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();/*ParsingDetector可用于检查HTML、XML等文件或字符流的编码,* 构造方法中的参数用于指示是否显示探测过程的详细信息,为false不显示。*/detector.add(new ParsingDetector(false));/*JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码测定。* 所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以再多加几个探测器,* 比如下面的ASCIIDetector、UnicodeDetector等。*/detector.add(JChardetFacade.getInstance());detector.add(ASCIIDetector.getInstance());detector.add(UnicodeDetector.getInstance());Charset charset = null;File file = new File(filePath);try {//charset = detector.detectCodepage(file.toURI().toURL());InputStream is = new BufferedInputStream(new FileInputStream(filePath));charset = detector.detectCodepage(is, 8);} catch (Exception e) {e.printStackTrace();throw e;}String charsetName = "GBK";if (charset != null) {if (charset.name().equals("US-ASCII")) {charsetName = "ISO_8859_1";} else if (charset.name().startsWith("UTF")) {charsetName = charset.name();// 例如:UTF-8,UTF-16BE.}}return charsetName;}

刚刚接触这个功能,希望能人多多指导

java检查文件的编码格式相关推荐

  1. Java 检查文件后生成8位随机数

    Java 检查文件后生成8位随机数 先检查目标文件中是否有数据,如果有则不执行操作,没有就生成一个新的8位随机数. import java.io.*; import java.util.Objects ...

  2. java检查文件上传完成,java – AmazonS3,如何检查上传是否成功?

    我用 Java编写了一个简短的测试代码来上传在内存中生成的PDF文件.在这个测试代码中我只使用一个虚拟字节数组,但在实际使用中,我将在该字节数组中放置一个生成的PDF(最多2-3页).一切正常:文件上 ...

  3. java常用文件工具类

    java常用工具类(一) 主要是Java操作文件及及IO流的一些常用库,是Apache对java的IO包的封装,这里面文件类工具有两个非常核心的类FilenameUtils跟FileUtils,IO流 ...

  4. java获取文件编码_java如何获取文件编码格式

    1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理 ...

  5. java 获取文件权限_Java中的文件权限,检查权限和更改权限 - Break易站

    Java提供了许多方法调用来检查和更改文件的权限,例如可以将只读文件更改为具有写入权限.当用户想要限制文件允许的操作时,需要更改文件权限.例如,文件权限可以从写入更改为只读,因为用户不再想要编辑文件. ...

  6. java 检测目录下的文件_如何在Java中检查文件是目录还是文件

    java 检测目录下的文件 java.io.File class contains two methods using which we can find out if the file is a d ...

  7. java 解析ASN.1 编码格式cdr话单文件例子

    java 解析ASN.1 编码格式cdr话单文件例子.程序中并没有将文件所有内容正确解析,只是一个例子

  8. java写入文件编码格式为ansi_Java读取、写入文件如何解决乱码问题

    读取文件流时,经常会遇到乱码的现象,造成乱码的原因当然不可能是一个,这里主要介绍因为文件编码格式而导致的乱码的问题.首先,明确一点,文本文件与二进制文件的概念与差异. 文本文件是基于字符编码的文件,常 ...

  9. java获取文件编码

    目录 1. 概述 2. 编码基本知识 2.1. iso8859-1 2.2. GB2312/GBK 2.3. unicode 2.4. UTF 3.JAVA中移位运算>> , <&l ...

  10. 检查文件编码是什么格式的

    可以使用一个开源项目cpdetector,它所在的网址是:http://cpdetector.sourceforge.net/.它的类库很小,只有500K左右,cpDetector是基于统计学原理的, ...

最新文章

  1. Scala error: type mismatch; found : java.util.List[?0] required: java.util.List[B]
  2. rsync实现linux间同步
  3. 霍夫变换检测圆c 语言,c – 使用Hough变换检测圆
  4. 如何在Kali Linux中安装Google Chrome浏览器
  5. git分支(branch)操作相关命令
  6. springboot中getOutputStream() has already been called for this response和java.io.FileNotFoundException
  7. [转]如何设置win7一直以管理员身份运行
  8. 无需担心架构演变 入云的Teradata无处不在
  9. [转]ASP.NET面试题
  10. 轻量型thttpd+php5
  11. Codeforces 1178
  12. Linux系统给进程绑核
  13. iphone编辑过的录音怎么还原_ios录音误剪怎么恢复
  14. TFIDF之python实现
  15. 使用 python 批量移动文件夹下的文件
  16. PCL:getCircumcircleRadius ❤️ 计算三角形外接圆半径
  17. Java学习lesson 10
  18. 华为智能家居app未能连接上远程云服务_智能家居平台介绍:华为HiLink
  19. python ImportError: cannot import name ' ×××'解决方法
  20. 关于笔记本检测不到外接显示器的问题

热门文章

  1. od 调试java_OD调试初步概念——修改窗口标题
  2. NLP任务增强:通过引入外部知识库来提供额外信息
  3. 北斗三号频点_解码北斗三号
  4. [安全防护]诺顿产品之Symantec Endpoint Protection
  5. SEO常用辅助工具整合
  6. Java 之父 James Gosling 最新访谈:JIT 很好,但不适合所有语言
  7. 电商实训三:网店经营
  8. 华为oj题库分苹果JAVA_华为OJ机试训练(一)
  9. mysql数据库安全吗_mysql数据库的安全
  10. 噪音测试软件+安卓,分贝噪音测试软件