HWliao
7 years ago
committed by
klboke
2 changed files with 198 additions and 0 deletions
@ -0,0 +1,157 @@ |
|||||||
|
package com.yudianbank.utils; |
||||||
|
|
||||||
|
import java.io.BufferedInputStream; |
||||||
|
import java.io.File; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.FileNotFoundException; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
import org.mozilla.intl.chardet.nsDetector; |
||||||
|
import org.mozilla.intl.chardet.nsICharsetDetectionObserver; |
||||||
|
|
||||||
|
/** |
||||||
|
* 文本文件编码探测工具类 |
||||||
|
* |
||||||
|
* @author HWliao |
||||||
|
* @date 2017-12-24 |
||||||
|
*/ |
||||||
|
public class FileCharsetDetector { |
||||||
|
|
||||||
|
/** |
||||||
|
* 传入一个文件(File)对象,检查文件编码 |
||||||
|
* |
||||||
|
* @param file File对象实例 |
||||||
|
* @return 文件编码,若无,则返回null |
||||||
|
* @throws FileNotFoundException |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static Observer guessFileEncoding(File file) |
||||||
|
throws FileNotFoundException, IOException { |
||||||
|
return guessFileEncoding(file, new nsDetector()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* <pre> |
||||||
|
* 获取文件的编码 |
||||||
|
* @param file |
||||||
|
* File对象实例 |
||||||
|
* @param languageHint |
||||||
|
* 语言提示区域代码 @see #nsPSMDetector ,取值如下: |
||||||
|
* 1 : Japanese |
||||||
|
* 2 : Chinese |
||||||
|
* 3 : Simplified Chinese |
||||||
|
* 4 : Traditional Chinese |
||||||
|
* 5 : Korean |
||||||
|
* 6 : Dont know(default) |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @return 文件编码,eg:UTF-8,GBK,GB2312形式(不确定的时候,返回可能的字符编码序列);若无,则返回null |
||||||
|
* @throws FileNotFoundException |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static Observer guessFileEncoding(File file, int languageHint) |
||||||
|
throws FileNotFoundException, IOException { |
||||||
|
return guessFileEncoding(file, new nsDetector(languageHint)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取文件的编码 |
||||||
|
* |
||||||
|
* @param file |
||||||
|
* @param det |
||||||
|
* @return |
||||||
|
* @throws FileNotFoundException |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
private static Observer guessFileEncoding(File file, nsDetector det) |
||||||
|
throws FileNotFoundException, IOException { |
||||||
|
// new Observer
|
||||||
|
Observer observer = new Observer(); |
||||||
|
// set Observer
|
||||||
|
// The Notify() will be called when a matching charset is found.
|
||||||
|
det.Init(observer); |
||||||
|
|
||||||
|
BufferedInputStream imp = new BufferedInputStream(new FileInputStream( |
||||||
|
file)); |
||||||
|
byte[] buf = new byte[1024]; |
||||||
|
int len; |
||||||
|
boolean done = false; |
||||||
|
boolean isAscii = false; |
||||||
|
|
||||||
|
while ((len = imp.read(buf, 0, buf.length)) != -1) { |
||||||
|
// Check if the stream is only ascii.
|
||||||
|
isAscii = det.isAscii(buf, len); |
||||||
|
if (isAscii) { |
||||||
|
break; |
||||||
|
} |
||||||
|
// DoIt if non-ascii and not done yet.
|
||||||
|
done = det.DoIt(buf, len, false); |
||||||
|
if (done) { |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
imp.close(); |
||||||
|
det.DataEnd(); |
||||||
|
|
||||||
|
if (isAscii) { |
||||||
|
observer.encoding = "ASCII"; |
||||||
|
observer.found = true; |
||||||
|
} |
||||||
|
|
||||||
|
if (!observer.isFound()) { |
||||||
|
String[] prob = det.getProbableCharsets(); |
||||||
|
// // 这里将可能的字符集组合起来返回
|
||||||
|
// for (int i = 0; i < prob.length; i++) {
|
||||||
|
// if (i == 0) {
|
||||||
|
// encoding = prob[i];
|
||||||
|
// } else {
|
||||||
|
// encoding += "," + prob[i];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
if (prob.length > 0) { |
||||||
|
// 在没有发现情况下,去第一个可能的编码
|
||||||
|
observer.encoding = prob[0]; |
||||||
|
} else { |
||||||
|
observer.encoding = null; |
||||||
|
} |
||||||
|
} |
||||||
|
return observer; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @author liaohongwei |
||||||
|
* @Description: 文件字符编码观察者, 但判断出字符编码时候调用 |
||||||
|
* @date 2016年6月20日 下午2:27:06 |
||||||
|
*/ |
||||||
|
public static class Observer implements nsICharsetDetectionObserver { |
||||||
|
|
||||||
|
/** |
||||||
|
* @Fields encoding : 字符编码 |
||||||
|
*/ |
||||||
|
private String encoding = null; |
||||||
|
/** |
||||||
|
* @Fields found : 是否找到字符集 |
||||||
|
*/ |
||||||
|
private boolean found = false; |
||||||
|
|
||||||
|
@Override |
||||||
|
public void Notify(String charset) { |
||||||
|
this.encoding = charset; |
||||||
|
this.found = true; |
||||||
|
} |
||||||
|
|
||||||
|
public String getEncoding() { |
||||||
|
return encoding; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isFound() { |
||||||
|
return found; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return "Observer [encoding=" + encoding + ", found=" + found + "]"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue