java检查文件的编码格式
近来碰到需要判断文件的编码格式,根据编码格式读取文件,网上百度了好几种方法,遂分享一下。
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检查文件的编码格式相关推荐
- Java 检查文件后生成8位随机数
Java 检查文件后生成8位随机数 先检查目标文件中是否有数据,如果有则不执行操作,没有就生成一个新的8位随机数. import java.io.*; import java.util.Objects ...
- java检查文件上传完成,java – AmazonS3,如何检查上传是否成功?
我用 Java编写了一个简短的测试代码来上传在内存中生成的PDF文件.在这个测试代码中我只使用一个虚拟字节数组,但在实际使用中,我将在该字节数组中放置一个生成的PDF(最多2-3页).一切正常:文件上 ...
- java常用文件工具类
java常用工具类(一) 主要是Java操作文件及及IO流的一些常用库,是Apache对java的IO包的封装,这里面文件类工具有两个非常核心的类FilenameUtils跟FileUtils,IO流 ...
- java获取文件编码_java如何获取文件编码格式
1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理 ...
- java 获取文件权限_Java中的文件权限,检查权限和更改权限 - Break易站
Java提供了许多方法调用来检查和更改文件的权限,例如可以将只读文件更改为具有写入权限.当用户想要限制文件允许的操作时,需要更改文件权限.例如,文件权限可以从写入更改为只读,因为用户不再想要编辑文件. ...
- java 检测目录下的文件_如何在Java中检查文件是目录还是文件
java 检测目录下的文件 java.io.File class contains two methods using which we can find out if the file is a d ...
- java 解析ASN.1 编码格式cdr话单文件例子
java 解析ASN.1 编码格式cdr话单文件例子.程序中并没有将文件所有内容正确解析,只是一个例子
- java写入文件编码格式为ansi_Java读取、写入文件如何解决乱码问题
读取文件流时,经常会遇到乱码的现象,造成乱码的原因当然不可能是一个,这里主要介绍因为文件编码格式而导致的乱码的问题.首先,明确一点,文本文件与二进制文件的概念与差异. 文本文件是基于字符编码的文件,常 ...
- java获取文件编码
目录 1. 概述 2. 编码基本知识 2.1. iso8859-1 2.2. GB2312/GBK 2.3. unicode 2.4. UTF 3.JAVA中移位运算>> , <&l ...
- 检查文件编码是什么格式的
可以使用一个开源项目cpdetector,它所在的网址是:http://cpdetector.sourceforge.net/.它的类库很小,只有500K左右,cpDetector是基于统计学原理的, ...
最新文章
- Scala error: type mismatch; found : java.util.List[?0] required: java.util.List[B]
- rsync实现linux间同步
- 霍夫变换检测圆c 语言,c – 使用Hough变换检测圆
- 如何在Kali Linux中安装Google Chrome浏览器
- git分支(branch)操作相关命令
- springboot中getOutputStream() has already been called for this response和java.io.FileNotFoundException
- [转]如何设置win7一直以管理员身份运行
- 无需担心架构演变 入云的Teradata无处不在
- [转]ASP.NET面试题
- 轻量型thttpd+php5
- Codeforces 1178
- Linux系统给进程绑核
- iphone编辑过的录音怎么还原_ios录音误剪怎么恢复
- TFIDF之python实现
- 使用 python 批量移动文件夹下的文件
- PCL:getCircumcircleRadius ❤️ 计算三角形外接圆半径
- Java学习lesson 10
- 华为智能家居app未能连接上远程云服务_智能家居平台介绍:华为HiLink
- python ImportError: cannot import name ' ×××'解决方法
- 关于笔记本检测不到外接显示器的问题