我们经常会遇到读取文件内容的情况,就需要判断文件是否为文本文件,及文件编码格式,防止乱码出现。
根据文件扩展名判定不太准确,可能会遇到未知扩展名或被修改了扩展名,下面的测试类使用文件头来判断,两个方法是:
1、判断文件是否为文本格式的文件 - isText
2、获取文件的编码格式 - getFilecharset
我们可以看下面实例代码,并可以在线测试一下。
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
public class TestFile {
public static void main(String[] args) {
File test = new File("/var/log/btmp");
boolean isText = isText(test);
System.out.println(isText);
if (isText) {
String charset = getFileCharset(test);
System.out.println(charset);
}
}
/**
* 判断文件是否为文本格式的文件
*
* @param file
* @return
*/
private static boolean isText(File file) {
boolean isText = true;
try {
FileInputStream fin = new FileInputStream(file);
long len = file.length();
for (int j = 0; j < (int) len; j++) {
int t = fin.read();
if (t < 32 && t != 9 && t != 10 && t != 13) {
isText = false;
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return isText;
}
/**
* 获取文件的编码格式
*
* @param sourceFile
* @return
*/
private static String getFileCharset(File sourceFile) {
String charset = "GBK";
byte[] first3Bytes = new byte[3];
try {
boolean checked = false;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));
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;
/**代码未完, 请加载全部代码(NowJava.com).**/
本文系作者在时代Java发表,未经许可,不得转载。如有侵权,请联系nowjava@qq.com删除。