java实现文件编码监测

最近在做一个文档的翻译项目,可文档的编码不知道,听头疼的。尝试了很多方法最后发现JCharDet这个工具可以轻松解决这个问题。于是作此笔记希望日后提醒自己以及帮助又需要的人。

  1. package com.uujava.mbfy.test;
  2. import java.io.BufferedInputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import org.mozilla.intl.chardet.nsDetector;
  8. import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
  9. /**********************************************
  10. * Maven
  11. * <!-- 用于文件编码检查 -->
  12. * <dependency>
  13. * <groupId>net.sourceforge.jchardet</groupId>
  14. * <artifactId>jchardet</artifactId>
  15. * <version>1.0</version>
  16. * </dependency>
  17. * *********************************************/
  18. /**
  19. * 借助JCharDet获取文件字符集 JCharDet
  20. * 是mozilla自动字符集探测算法代码的java移植,其官方主页为:
  21. * http://jchardet.sourceforge.net/
  22. */
  23. public class FileCharsetDetector {
  24. private boolean found = false;
  25. /**
  26. * 如果完全匹配某个字符集检测算法, 则该属性保存该字符集的名称.
  27. * 否则(如二进制文件)其值就为默认值 null, 这时应当查询属性
  28. */
  29. private String encoding = null;
  30. public static void main(String[] argv) throws Exception {
  31. System.out
  32. .println("文件编码:"
  33. + new FileCharsetDetector()
  34. .guestFileEncoding("/home/k/Documents/test/azmind_7_xh/azmind_7_xh/路由管理.txt"));
  35. }
  36. /**
  37. * 传入一个文件(File)对象,检查文件编码
  38. *
  39. * @param file
  40. * File对象实例
  41. * @return 文件编码,若无,则返回null
  42. * @throws FileNotFoundException
  43. * @throws IOException
  44. */
  45. public String guestFileEncoding(File file) throws FileNotFoundException,
  46. IOException {
  47. return geestFileEncoding(file, new nsDetector());
  48. }
  49. /**
  50. * 获取文件的编码
  51. *
  52. * @param file
  53. * File对象实例
  54. * @param languageHint
  55. * 语言提示区域代码 eg:1 : Japanese; 2 : Chinese; 3 : Simplified Chinese;
  56. * 4 : Traditional Chinese; 5 : Korean; 6 : Dont know (default)
  57. * @return 文件编码,eg:UTF-8,GBK,GB2312形式,若无,则返回null
  58. * @throws FileNotFoundException
  59. * @throws IOException
  60. */
  61. public String guestFileEncoding(File file, int languageHint)
  62. throws FileNotFoundException, IOException {
  63. return geestFileEncoding(file, new nsDetector(languageHint));
  64. }
  65. /**
  66. * 获取文件的编码
  67. *
  68. * @param path
  69. * 文件路径
  70. * @return 文件编码,eg:UTF-8,GBK,GB2312形式,若无,则返回null
  71. * @throws FileNotFoundException
  72. * @throws IOException
  73. */
  74. public String guestFileEncoding(String path) throws FileNotFoundException,
  75. IOException {
  76. return guestFileEncoding(new File(path));
  77. }
  78. /**
  79. * 获取文件的编码
  80. *
  81. * @param path
  82. * 文件路径
  83. * @param languageHint
  84. * 语言提示区域代码 eg:1 : Japanese; 2 : Chinese; 3 : Simplified Chinese;
  85. * 4 : Traditional Chinese; 5 : Korean; 6 : Dont know (default)
  86. * @return
  87. * @throws FileNotFoundException
  88. * @throws IOException
  89. */
  90. public String guestFileEncoding(String path, int languageHint)
  91. throws FileNotFoundException, IOException {
  92. return guestFileEncoding(new File(path), languageHint);
  93. }
  94. /**
  95. * 获取文件的编码
  96. *
  97. * @param file
  98. * @param det
  99. * @return
  100. * @throws FileNotFoundException
  101. * @throws IOException
  102. */
  103. private String geestFileEncoding(File file, nsDetector det)
  104. throws FileNotFoundException, IOException {
  105. // Set an observer...
  106. // The Notify() will be called when a matching charset is found.
  107. det.Init(new nsICharsetDetectionObserver() {
  108. public void Notify(String charset) {
  109. found = true;
  110. encoding = charset;
  111. }
  112. });
  113. BufferedInputStream imp = new BufferedInputStream(new FileInputStream(file));
  114. byte[] buf = new byte[1024];
  115. int len;
  116. boolean done = false;
  117. boolean isAscii = true;
  118. while ((len = imp.read(buf, 0, buf.length)) != -1) {
  119. // Check if the stream is only ascii.
  120. if (isAscii)
  121. isAscii = det.isAscii(buf, len);
  122. // DoIt if non-ascii and not done yet.
  123. if (!isAscii && !done)
  124. done = det.DoIt(buf, len, false);
  125. }
  126. det.DataEnd();
  127. if (isAscii) {
  128. encoding = "ASCII";
  129. found = true;
  130. }
  131. if (!found) {
  132. String prob[] = det.getProbableCharsets();
  133. if (prob.length > 0) {
  134. // 在没有发现情况下,则取第一个可能的编码
  135. encoding = prob[0];
  136. } else {
  137. return null;
  138. }
  139. }
  140. return encoding;
  141. }
  142. }

java实现文件编码监测的更多相关文章

  1. java实现文件编码监测(转)

    chardet是mozilla自动字符集探测算法代码的java移植.这个算法的最初作者是frank Tang,C++源代码在http://lxr.mozilla.org/mozilla/source/ ...

  2. 使用java进行文件编码转换

    在开发过程中,可能会遇到文件编码的转换,尽管说开发工具eclipse能够转换编码,可是有的情况却非常不方便.比方,原来文件本身的编码是GBK,如今要转换成UTF-8,假设直接在eclipse中把文件编 ...

  3. Java文件编码自动转换工具类(只改变编码,不会改变文件内容)

    本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. public class Cha ...

  4. java文件传输之文件编码和File类的使用

    ---恢复内容开始--- 我们知道,在用户端和服务端之间存在一个数据传输的问题,例如下载个电影.上传个照片.发一条讯息.在这里我们 就说一下文件的传输. 1.文件编码 相信大家小时候玩过积木(没玩过也 ...

  5. 文件编码检测.ZC一些资料(包含java的)

    1.IMultiLanguage3 或者 IMultiLanguage2 1.1.怎么判断XML 的编码格式(UTF-8或GB2312等)-CSDN论坛.html(https://bbs.csdn.n ...

  6. 用java修改文件的编码

    1.将本地的文件转换成另外一种编码输出,主要逻辑代码如下: /** * 将本地文件以哪种编码输出 * @param inputfile 输入文件的路径 * @param outfile 输出文件的路径 ...

  7. Java以UTF-8编码读写文件

    java中文件操作体现了设计模式中的装饰者模式 . 以utf-8编码写入文件: FileOutputStream fos = new FileOutputStream("test.txt&q ...

  8. java读取文件并获得文件编码,转换为指定编码的工具类代码

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  9. 【转载】Java文件编码自动转换工具类

    本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. 1 public class C ...

随机推荐

  1. [转]ReactJS入门教程

    Refference From:http://www.cocoachina.com/webapp/20150721/12692.html 现在最热门的前端框架有AngularJS.React.Boot ...

  2. UVa10340.All in All

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. the5fire博客对接微信公众平台接口 | the5fire的技术博客

    the5fire博客对接微信公众平台接口 | the5fire的技术博客 the5fire博客对接微信公众平台接口

  4. IT技术如何转向销售创业

    广州 IT 网友  14:14:10 本人本科软件工程毕业,现在在一家公司做开发(不是很技术的那种),工作接近两年感觉自 己不适合这个行业,想换销售行业,不愿意在做技术.打算从事本行业的销售,老师给点 ...

  5. jQuery ajax - getScript() 方法和getJSON方法

    实例 使用 AJAX 请求来获得 JSON 数据,并输出结果: $("button").click(function(){ $.getJSON("demo_ajax_js ...

  6. Android应用开发学习之Toast消息提示框

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 本文我们来看Toast消息提示框的用法.使用Toast消息提示框一般有三个步骤: 1.  创建一个Toast对象.可 ...

  7. php创建带logo的二维码

    <?php /** php使用二维码 **/ class MyQrcode{ const SIZE = 150; const LEVEL = "L"; const MARGI ...

  8. BZOJ 2648/2716(SJY把件-KD_Tree)[Template:KD_Tree]

    2648: SJY把件 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1180  Solved: 391 [id=2648" style= ...

  9. C#中方法Show.和ShowDialog的使用区别

    show()是非模式窗体. showDialog()是模式窗体. 如果这个时候用Show的话,则会发生的事情是,打开子窗体的同时主窗体又显示出来,而使用ShowDialog()的时候主要当子窗体关闭的 ...

  10. Android中获取apk基本信息

    一 PackageManager可以获得的所有包节点信息: 1,所有节点的基类:PackageItemInfo: 2,PackageInfo:package的全面信息,与AndroidManifest ...