com.github.cosycode.ext.se.util.FileUtils Maven / Gradle / Ivy
Show all versions of extend-mod Show documentation
package com.github.cosycode.ext.se.util;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
/**
* Description :
*
* created in 2021/4/30
*
* @author CPF
**/
@Slf4j
public class FileUtils {
/**
* 判断文件的编码格式
*
* @param fileName :file
* @return 文件编码格式
*/
public static String analysisTextFileEncode(File fileName) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName))) {
String charset = "GBK";
byte[] first3Bytes = new byte[3];
boolean checked = false;
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"; // 文件编码为 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) {
while ((read = bis.read()) != -1) {
if (read >= 0xF0) {
break;
}
if (0x80 <= read && read <= 0xBF) {
break;
}
if (0xC0 <= read && read <= 0xDF) {
read = bis.read();
if (0x80 <= read && read <= 0xBF) {
// (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;
}
}
}
}
return charset;
} catch (IOException e) {
log.error("", e);
}
return "null";
}
}