`
philip01
  • 浏览: 47138 次
  • 来自: ...
社区版块
存档分类
最新评论

批量修改文件的编码

阅读更多

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;

import org.mozilla.intl.chardet.HtmlCharsetDetector;
import org.mozilla.intl.chardet.nsDetector;
import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
import org.mozilla.intl.chardet.nsPSMDetector;

/**
 * @author  springmvc2006@sina.com
 *
 */
public class ChangeFile2UTF8 {

 public static void main(String[] args) throws Exception {
  String newEncoding = "utf-8"; // 文件新的编码
  File oldFileDir = new File("D:/task/input");
  String newFileDir = "D:/task/output";
  ChangeTask(oldFileDir, newFileDir, newEncoding);
  System.out.println("转码为:"+newEncoding+"...成功");
 }
 
 /**
  * 递归函数
  * @param oldFileDir
  * @param newFileDir
  * @param newEncoding
  * @throws Exception
  */
 public static void ChangeTask(File oldFileDir, String newFileDir, String newEncoding)throws Exception{

  if (oldFileDir.isDirectory()) {
   File[] oldFile = oldFileDir.listFiles();
   for (int i = 0; i < oldFile.length; i++) {
    if(oldFile[i].isFile()){
     if(oldFile[i].getName().indexOf(".jar") != -1){
      System.out.println(oldFile[i].getName());
      continue;
     } //jar 文件不要转
     String   encodingOld = new FileCharsetDetector().guestFileEncoding(oldFile[i], 2);
     System.out.println(oldFile[i].getAbsolutePath() +"....."+encodingOld);
     //encodingOld = "unicode";
     if("windows".toLowerCase().indexOf(encodingOld) != -1){
      encodingOld = "unicode";
     }else if("Big".toLowerCase().indexOf(encodingOld) != -1){
      encodingOld = "gbk";
     }else if("nomatch".toLowerCase().indexOf(encodingOld) != -1){
      encodingOld = "gbk";
     }

     saveFile2OtherEncoding(new File(oldFileDir, oldFile[i]
                                       .getName()), newFileDir, encodingOld, newEncoding);
    }else{
     ChangeTask(oldFile[i], newFileDir+"/"+oldFile[i].getName(), newEncoding);
    }

   }

  }
 }

 /**
  * 转码函数
  * @param oldFile
  * @param newFilePathString
  */
 public static void saveFile2OtherEncoding(File oldFile, String newFileDir,
   String oldEncoding, String newEncoding)throws Exception {
  FileInputStream fileInputStream = null;
  InputStreamReader inputStreamRead = null;
  BufferedReader bufferRead = null;

  BufferedWriter newFileBW = null;
  OutputStreamWriter outputStreamWriter = null;
  FileOutputStream fileOutputStream = null;


  try {
   fileInputStream = new FileInputStream(oldFile);
   inputStreamRead = new InputStreamReader(fileInputStream, oldEncoding);
   bufferRead = new BufferedReader(inputStreamRead);
   createFileName(newFileDir);
   File copyFile = new File(newFileDir, oldFile.getName());
   fileOutputStream = new FileOutputStream(copyFile, false);
   outputStreamWriter = new OutputStreamWriter(fileOutputStream,
     newEncoding);
   newFileBW = new BufferedWriter(outputStreamWriter);

   String strTSVLine = "";
   while ((strTSVLine = bufferRead.readLine()) != null) {
    if (strTSVLine.equals("")) {
     continue;
    }
    newFileBW.write(strTSVLine+ "\r\n");
    //newFileBW.write(strTSVLine.replaceAll("=gbk", "=utf-8")+ "\r\n");
    //System.out.println(strTSVLine);
   }

  } finally {
   if (bufferRead != null)
    bufferRead.close();
   if (newFileBW != null) {
    newFileBW.flush();
    newFileBW.close();
   }
  }
  

 }

 /**
  * 创建文件夹
  * @param newFileDir
  */
 public static void createFileName(String newFileDir) {
  File newFile = new File(newFileDir);
  if (!newFile.exists()) {
   newFile.mkdirs();
  }
 }
}

class FileCharsetDetector {
    private boolean found = false;  
   
     /** 
      * 如果完全匹配某个字符集检测算法, 则该属性保存该字符集的名称. 否则(如二进制文件)其值就为默认值 null, 这时应当查询属性  
      */ 
     private String encoding = null;  
  
     public static void mains(String[] argv) throws Exception {  
            String   encoding = new FileCharsetDetector().guestFileEncoding("D:/task/input/GetAllStlrsDocAction.java");  
            String   encodingTwo = new FileCharsetDetector().guestFileEncoding(new File("D:/task/input/GetAllStlrsDocAction.java"), 2);  
           
            System.out.println(encoding);
            System.out.println(encodingTwo);
     }  
  
     /** 
      * 传入一个文件(File)对象,检查文件编码 
      *  
      * @param file 
      *            File对象实例 
      * @return 文件编码,若无,则返回null 
      * @throws FileNotFoundException 
      * @throws IOException 
      */ 
     public String guestFileEncoding(File file) throws FileNotFoundException,  
             IOException {  
         return geestFileEncoding(file, new nsDetector());  
     }  
  
     /** 
      * 获取文件的编码 
      *  
      * @param file 
      *            File对象实例 
      * @param languageHint 
      *            语言提示区域代码 eg:1 : Japanese; 2 : Chinese; 3 : Simplified Chinese; 
      *            4 : Traditional Chinese; 5 : Korean; 6 : Dont know (default) 
      * @return 文件编码,eg:UTF-8,GBK,GB2312形式,若无,则返回null 
      * @throws FileNotFoundException 
      * @throws IOException 
      */ 
     public String guestFileEncoding(File file, int languageHint)  
             throws FileNotFoundException, IOException {  
         return geestFileEncoding(file, new nsDetector(languageHint));  
     }  
  
     /** 
      * 获取文件的编码 
      *  
      * @param path 
      *            文件路径 
      * @return 文件编码,eg:UTF-8,GBK,GB2312形式,若无,则返回null 
      * @throws FileNotFoundException 
      * @throws IOException 
      */ 
     public String guestFileEncoding(String path) throws FileNotFoundException,  
             IOException {  
         return guestFileEncoding(new File(path));  
     }  
  
     /** 
      * 获取文件的编码 
      *  
      * @param path 
      *            文件路径 
      * @param languageHint 
      *            语言提示区域代码 eg:1 : Japanese; 2 : Chinese; 3 : Simplified Chinese; 
      *            4 : Traditional Chinese; 5 : Korean; 6 : Dont know (default) 
      * @return 
      * @throws FileNotFoundException 
      * @throws IOException 
      */ 
     public String guestFileEncoding(String path, int languageHint)  
             throws FileNotFoundException, IOException {  
         return guestFileEncoding(new File(path), languageHint);  
     }  
  
     /** 
      * 获取文件的编码 
      *  
      * @param file 
      * @param det 
      * @return 
      * @throws FileNotFoundException 
      * @throws IOException 
      */ 
     private String geestFileEncoding(File file, nsDetector det)  
             throws FileNotFoundException, IOException {  

         // Set an observer...  
         // The Notify() will be called when a matching charset is found.  
         det.Init(new nsICharsetDetectionObserver() {  
             public void Notify(String charset) {
                 found = true;  
                 encoding = charset;
             }  
         });  
        
        
  
         BufferedInputStream imp = new BufferedInputStream(new FileInputStream(  
                 file));  
  
         byte[] buf = new byte[1024];  
         int len;  
         boolean done = false;  
         boolean isAscii = true;  
  
         while ((len = imp.read(buf, 0, buf.length)) != -1) {  
             // Check if the stream is only ascii.  
             if (isAscii)  
                 isAscii = det.isAscii(buf, len);  
  
             // DoIt if non-ascii and not done yet.  
             if (!isAscii && !done)  
                 done = det.DoIt(buf, len, false);  
         }  
         det.DataEnd();  
  
         if (isAscii) {  
             encoding = "ASCII";  
             found = true;  
         }  
  
         if (!found) {  
             String prob[] = det.getProbableCharsets();  
             if (prob.length > 0) {  
                 // 在没有发现情况下,则取第一个可能的编码  
                 encoding = prob[0];  
             } else {  
                 return null;  
             }  
            
         }  
         return encoding;  
     }
}

 

分享到:
评论
1 楼 宋建勇 2014-02-27  
org.mozilla.intl.chardet.HtmlCharsetDetector的jar包呢

相关推荐

    批量修改文件编码软件

    手动逐个修改大量文件显然效率低下,因此出现了专门的批量修改编码软件,如标题所提及的"批量修改文件编码软件"。 该软件允许用户通过拖动文件夹的方式选择需要处理的文件集,然后通过“查找文件”功能搜索特定类型...

    批量更改文件编码工具

    本文将深入探讨批量更改文件编码工具的重要性和使用方法,以及它如何为开发人员提供便利。 批量更改文件编码工具,正如其标题所示,是一种能够一次性处理大量文件,将它们的编码格式转换为另一种编码格式的软件。...

    C#:批量修改文本编码为UTF-8(含源码)

    下面我们将详细介绍如何实现批量修改文件编码的C#代码: 1. **遍历文件夹**: 首先,我们需要获取指定文件夹及其子文件夹下的所有文件。可以使用DirectoryInfo类和GetFiles方法配合递归实现。 2. **检查文件扩展...

    网上偶得,批量更改文件编码工具,可以同时搜索子文件夹,可以指定文件类型,用得顺手,拿来混点分,感谢作者

    有了这样的批量更改文件编码工具,用户可以指定目标编码(如UTF-8),并选择特定的文件类型(如.txt或.csv),工具会自动完成转换过程,确保所有文件都统一为新的编码格式,从而避免因编码不一致导致的阅读或处理...

    vs文件编码批量转换工具

    此工具可批量修改文件编码(默认gb2312转utf8,可修改) python版本:2.7 使用说明: dirGb2312ToUtf8('F:\work\MyProject\Source\MyProject') 把以上路径改为自己需要转换的文件夹即可

    批量修改文本文件的编码方式至UTF-8或ANSI,可用于批量修改CUE格式文件

    针对批量修改文件编码的需求,这里提供了一个名为“Ansi 2 Utf8.exe”的工具,它能够帮助用户快速地将TXT、CUE等文件从ANSI编码转换为UTF-8编码,反之亦然。这个工具支持的文件扩展名非常广泛,包括.txt、.html、....

    批量文件编码转换器

    批量文件编码转换 只识别文本类文件,识别的是文件头,不是后缀。所以只要是文本文件,无论什么后缀都能识别。如有需要联系 yyxu123@163.com

    Qt文件编码批量转换

    Qt5.9开发的文件编码转换。该工具我用来在Windows7下面VS2015编译器与MinGW编译器编码转换。MinGW编译器使用UTF-8编码,VS2015使用GB2312编码。 预编译头文件缺失,将头文件替换为 #include #include #include #...

    批量修改文件编码格式

    非常好用的一款编码转换软件,批量修改,不论是单文件还是文件夹,直接拖入就可修改成自己希望的编码方式,适合程序员在不同编码格式的电脑直接传输文件时转换,绿色无毒,自用,放心

    批量转换文件编码格式为UTF-8工具

    批量转换文件编码格式为UTF-8工具.zip 支持多层文件夹替换! 使用说明: 1.文件根目录:即您要转码的文件所在根目录 2.转码文件目录:即您转码后的文件所在目录 3.转码文件后缀:指[文件根目录]下,需要转码的文件后缀,...

    Linux下批量修改文件编码

    ### Linux下批量修改文件编码 在Linux环境下,批量修改文件编码是常见的操作需求之一,尤其在处理不同系统间文件交互时尤为重要。本文将详细介绍如何在Linux下实现文件编码的批量转换,并通过一个具体示例来展示...

    批量修改TXT文档编码

    - **注意文件编码的兼容性**:不同的系统和应用程序可能支持不同的编码,确保转换后的编码是广泛兼容的。 - **处理非ASCII字符**:对于包含非ASCII字符(如中文、日文等)的文件,转换时要特别注意,以免出现乱码。...

    批量修改文件的编码格式.doc

    批量修改文件的编码格式.doc ...其实这样大多是由于文件编码格式不对造成的! 今天从公司拷回来的系统,运行老报JS错,开始发现一个修改一个,但后来工作量太大,又懒得写一个程序,想在网上找找有没有现成的软件。

    Emeditor批量修改文件编码格式(UTF-8)-附件资源

    Emeditor批量修改文件编码格式(UTF-8)-附件资源

    批量修改txt编码

    "批量修改txt编码"这个主题涉及到的是如何有效地转换大量TXT文本文件的字符编码格式,以便它们能在各种环境下正确显示和处理。这个工具可能是由一个程序员为个人使用而编写的,虽然界面和功能可能相对简洁,但其核心...

    Shell脚本遍历目录并批量修改文件编码

    ### Shell脚本遍历目录并批量修改文件编码 在IT领域中,特别是在处理跨平台文件时,经常会遇到编码格式不一致的问题。例如,从Windows环境移植到Linux环境时,文件编码可能需要从GBK转换为UTF-8。通过编写Shell脚本...

    java批量修改指定文件夹下多级文件编码格式

    经常碰到文件编码格式不一致导致一堆问题,想在linux上批量修改文件夹下的文件编码,操作太麻烦,花了一点时间写了个java程序来操作,用着非常方便,详情如下: 在FileEncodeTranslate类中,修改一下源文件夹路径,...

    文件编码格式批量修改工具

    本文将深入探讨“文件编码格式批量修改工具”,它是一款专为Windows用户设计的实用程序,旨在帮助用户快速、便捷地将Unicode、UTF-8和GB2312等不同编码格式的文件进行批量转换。 首先,我们要理解各种编码格式的...

    批量文件编码转换工具

    本工具名为"批量文件编码转换工具",专门针对那些需要处理大量文件编码问题的用户,能够有效地节省时间和精力。 GB2312编码,全称“中华人民共和国国家标准汉字编码”,是简体中文字符集的一种标准,主要应用于早期...

    javascript批量修改文件编码格式的方法

    本文实例讲述了javascript批量修改文件编码格式的方法。分享给大家供大家参考。具体如下: 摘要: 最近在制作手册的时候遇到了一个问题’文档乱码’,查看文件之后发现文件编码不对,总共100多个文件,如果用编辑器...

Global site tag (gtag.js) - Google Analytics