`
hyw520110
  • 浏览: 219532 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

文件转码

    博客分类:
  • java
 
阅读更多

工程项目太多,各工程或各文件编码不统一时,可运行本工具类,把工作目录下,指定类型的文件,转换成指定的编码格式

 

源码:

import info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import info.monitorenter.cpdetector.io.JChardetFacade;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 文本文件转码
 * @author Howard.He
 */
public class TransFileCoding {

    private static final Logger logger = LoggerFactory.getLogger(TransFileCoding.class);

    public static void main(String[] args) {
        String dirPath = "E:/workspace/";
        String suffix = ".java";
        transformEncoding(dirPath, suffix, "UTF-8");
    }

    /**
     * 文件转码 (文本文件)
     * 
     * @param dirPath
     *            工程路径
     * @param suffix
     *            要转码文件的后缀(.java)
     * @param newEncoding
     *            转换的编码
     */
    public static void transformEncoding(String dirPath, String suffix, String newEncoding) {
        List<File> list = getFileList(null, dirPath, suffix);
        if (null != list && !list.isEmpty()) {
            for (File f : list) {
                String encoding = getFileCharacterEnding(f);
                newEncoding = isEmpty(newEncoding) ? getFileCharacterEnding(f) : newEncoding;
                if (!encoding.equals(newEncoding)) {
                    StringBuilder content = readContent(f, encoding);
                    logger.info("convert file encoding from {} to {}" ,new Object[]{encoding,newEncoding});
                    write(f, content, newEncoding);
                }
                else {
                    logger.debug("srcEncoding({})==dstEncoding({}) skipped f: {}", new Object[] { encoding, newEncoding, f.toString() });
                }
            }
        }
    }

    /**
     * 取文件的编码格式
     * 异常时默认UTF-8
     * 
     * @param file
     * @return
     */
    @SuppressWarnings("deprecation")
    public static String getFileCharacterEnding(File file) {
        String fileCharacterEnding = "UTF-8";
        CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
        detector.add(JChardetFacade.getInstance());
        try {
            Charset charset = detector.detectCodepage(file.toURL());
            if (charset != null)
                fileCharacterEnding = charset.name();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return fileCharacterEnding;
    }

    /**
     * 获取指定路径下的特定类型的文件集
     * 
     * @param list
     * @param dirPath
     * @param suffix
     * @return
     */
    public static List<File> getFileList(List<File> list, String dirPath, String suffix) {
        File dir = new File(dirPath);
        if (dir.exists()) {
            File[] files = dir.listFiles();
            if (null == list)
                list = new ArrayList<File>();
            for (File f : files) {
                String name = f.getName();
                if (f.isDirectory() && !name.equals(".svn"))
                    getFileList(list, f.getPath(), suffix);
                else if (f.isFile() && name.endsWith(suffix))
                    list.add(f);
            }
        }
        return list;
    }

    public static StringBuilder readContent(File f, String encoding) {
        return readContent(f, encoding, "\n");
    }

    /**
     * 读取文件内容
     * 
     * @param f
     * @param encoding
     * @return
     */
    public static StringBuilder readContent(File f, String encoding, String enter) {
        StringBuilder builder = new StringBuilder();
        try {
            encoding = encoding == null ? getFileCharacterEnding(f) : encoding;
            String data = null;
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f), encoding));
            while ((data = br.readLine()) != null) {
                builder.append(isEmpty(enter) ? data : data + enter);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return builder;
    }

    /**
     * 写入文件内容
     * 
     * @param f
     * @param content
     * @param newEncoding
     */
    private static void write(File f, StringBuilder content, String newEncoding) {
        try {
            logger.debug("write file:{}",f);
            logger.debug(content.toString());
            OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(f), newEncoding);
            writer.write(content.toString());
            writer.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static boolean isEmpty(String str) {
        return null == str || "".equals(str);
    }
}

 

取文件编码格式,依赖cpdetector ,可到 http://cpdetector.sourceforge.net/  下载lib包

使用maven时,直接添加依赖信息:

 

  <dependency>
   <groupId>org.mozilla.intl</groupId>
   <artifactId>chardet</artifactId>
   <version>1.4.2</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>info.monitorenter</groupId>
   <artifactId>cpdetector</artifactId>
   <version>1.0.7</version>
   <scope>test</scope>
  </dependency>

  

分享到:
评论

相关推荐

    项目文件转码java源码

    实际项目中有很多文件的编码是非utf编码,当多种编码的文件相互包含时,会出现乱码。 应实际需求,特写一个java程序,将非utf8编码的文件,转换为utf8编码。省却了一个文件一个文件修改的...可快速批量的见文件转码。

    天翼网关F452配置文件转码软件

    天翼网关F452配置文件转码软件

    批量文件转码工具,支持GBK,UTF-8转换,window下面使用,亲测可以使用!.zip

    标题中提到的“批量文件转码工具,支持GBK,UTF-8转换”就是这样一个实用工具,特别适合那些需要在GBK和UTF-8之间频繁切换的用户,例如网站开发者、数据处理人员等。 在Windows系统下使用该工具,用户可以轻松解决...

    批量文件转码工具(支持GBK,UTF-8转换)

    批量文件转码工具,正如标题和描述所提到的,是用来解决大量文件从一种编码格式转换到另一种格式的问题。在Windows环境下,这类工具通常具有用户友好的界面,允许用户选择待转换的文件或文件夹,设定目标编码格式,...

    文件转码软件

    文件转码在IT行业中是一项常见的操作,特别是在处理各种格式的文档和媒体时。"文件转码软件"是指能够将一种文件格式转换成另一种格式的工具,以满足不同平台、设备或应用程序的需求。在这个场景中,描述提到的"对...

    监控视频.dav文件转码工具,支持转换为多种格式(MP4、AVI、WMV、MXF、GIF、DPG、MTV、AMV、SWF等)

    监控视频.dav文件转码工具,支持转换为多种格式(MP4、AVI、WMV、MXF、GIF、DPG、MTV、AMV、SWF等多种格式,应有尽有。)。本软件为英文版软件,没有中文版,介意的话不要下载,避免浪费积分。也可当播放器使用,...

    批量文件转码工具

    批量文件转码工具 批量文件转码工具 批量文件转码工具 批量文件转码工具 批量文件转码工具

    批量文件转码工具(支持 GBK,UTF-8 转换)

    文件转码工具就是为了解决这个问题而设计的,它们可以帮助用户将文件从一种字符编码格式转换为另一种,以确保文本的正确显示和处理。在这个场景中,我们讨论的是一个专门用于批量转换的工具,它支持GBK和UTF-8这两种...

    华为猫 cfg文件转码

    华为 cfg转码 可利用此软件查看华为猫cfg文件

    txt乱码解决处理文本文件转码编码csv器gbk互转utf-8自动批量工具html,js,css,md,json,log,py

    支持任意纯文本文件转码(解决任意纯文本文件乱码问题),其能够处理的文件包括但不限于以下几种: 纯文本文件 (.txt,.csv ) 这些文件通常只包含纯文本,没有特殊的格式或样式。 编程语言的源代码文件 Python (.py...

    myEclipse或Eclipse批量文件转码插件

    比如图2的转码规则就是对项目的jsp文件,不管原来是什么编码,统一转为UTF-8编码,并且同时转换文件内容。可以点击右边的Add /Remove按钮来增加/删除规则。最后点击Apply来保存设置。 step3. 转码 在设置了转码规...

    MFC界面实现文件转码

    在MFC中实现文件转码,首先需要读取源文件,然后根据源文件的原始编码进行解码,再按照目标编码进行编码,最后将结果写入新文件。在这个过程中,`CFile`类是用于文件操作的基础,而`CString`类则用于处理字符串。 ...

    获取文件编码格式与文件转码

    在IT行业中,尤其是在Android开发中,处理文件编码格式与文件转码是常见的任务。编码格式决定了文本文件中字符的表示方式,不同的编码如ASCII、UTF-8、GBK等有着不同的规则。了解并能够正确处理文件编码对于确保程序...

    强大的音视频文件转码SDK

    【音视频文件转码SDK详解】 音视频转码是数字媒体处理中的关键技术,它涉及到将原始的音视频数据转换成不同编码格式,以适应不同的播放设备、网络环境或存储需求。这里提到的“强大的音视频文件转码SDK”,显然是一...

    GBK_UTF8批量文件转码工具

    "GBK_UTF8批量文件转码工具"是一个专门用于解决编码转换问题的实用程序,它能够帮助用户将GBK编码的文件批量转换为UTF-8编码。在开发过程中,尤其是使用Eclipse这样的集成开发环境时,如果源代码文件的编码与IDE的...

    文件转码UTF8工具

    在本项目中,"文件转码UTF8工具"是一个用C#编写的Windows桌面应用程序(WinForm),其核心功能是帮助用户批量将指定文件夹中的文件转码为UTF-8格式。这个工具不仅方便了开发者和普通用户对文本文件的管理,还提供了...

    音频文件转码java开发,基于jave开源框架

    在Java开发中,音频文件转码是一项常见的任务,特别是在多媒体应用、音频处理或者网络音频传输等领域。本项目基于Jave开源框架,它提供了一个高效且易于使用的API来处理音频编码和解码工作。Jave(Java Audio Video ...

    mysql导出csv&&iconv;文件转码.pdf

    在当今数据处理领域,将数据从数据库导出到CSV文件并进行转码是一种常见的需求,特别是在使用MySQL数据库时。本内容将详细介绍如何使用mysql命令行工具导出数据为CSV格式,并结合iconv命令行工具进行编码转换。同时...

Global site tag (gtag.js) - Google Analytics