`
everest668
  • 浏览: 2619 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

文件任意编码转换工具 ExecuteConvertFile

阅读更多

在项目中引用了多个地方的文件,但是编码方式不统一,有gb2312、gbk、gb18030、ascii、utf-8等,很混乱。

 

在网上查找了一些编码转换的工具,但是都不理想。于是就自己写了一个编码转换的工具。可以将指定的文本类型源文件或者目录中的所有指定的文本类型子文件都转换成指定的编码类型,并按路径结构保存到目标目录下。其他非文本类型的文件,则直接复制保存。

 

其中引用了mozilla的一个编码查询的包,用于检索文件的编码类型。

 

以下是主要的代码:(jar包在附件中)

 

接口:
ConvertEncoding.java 编码转换

/**
 * FileName:EncodingConvert.java
 * Creater: Landry
 * Create Date:2010-3-15
 * Commonents:
 * Version: 1.0
 */
package com.landry.encoding;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Project:ConvertTxtEncoding
 * Create Dat:2010-3-15
 * Modified Date:
 * Commonents: 文件编码的转换并保存
 * @author Landry
 * @version 1.0
 */
public interface ConvertEncoding
{
	/**
	 * 得到文件的编码类型
	 * @param file
	 * @return 文件的编码类型
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public String getFileCharacter (File file) throws FileNotFoundException,
			IOException;
	
	/**
	 * 判断是否是指定的文本类型的文件
	 * @param file
	 * @return true:是指定的文本类型 false:不是指定的文本类型
	 */
	public boolean isTextFile (File file);
	
	/**
	 * 设置包含的要进行处理的文件(扩展名),以"<b>|</b>"进行分隔<br/>
	 * 如果没有设置,则执行默认包含的文本文件:txt、ini、java、jsp、jspa、htm、html、xml、js、vbs、css、properties、ftl、php、asp
	 * @param fileExtName
	 */
	public void setInclude (String fileExtName);

	/**
	 * 得到文件的扩展名
	 * @param file
	 * @return null表示不是标准的文件,可能是目录
	 */
	public String getFileExtName (File file);
	
	/**
	 * 按encoding指定的编码方式,将文件转换到指定目录
	 * @param inFilename
	 * @param outFilename
	 * @param encoding
	 * @throws IOException
	 * @throws FileNotFoundException
	 */
	public void convertEncoding (String inFilename, String outFilename,
			String encoding) throws FileNotFoundException, IOException;
	
	/**
	 *文本文件转换编码的核心过程
	 * @param inFilename
	 * @param outFilename
	 * @param encoding
	 * @throws IOException
	 * @throws FileNotFoundException
	 */
	public void convertEncodingProcess (String inFilename, String outFilename,
			String encoding) throws FileNotFoundException, IOException;
	
	/**
	 * 直接复制标准文件
	 * @param inFilename
	 * @param outFilename
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public void copyBinaryFile (String inFilename, String outFilename)
			throws FileNotFoundException, IOException;
}

 
ExecuteConvertFile.java 执行文件的转换保存

/**
 * FileName:ExecuteFile.java
 * Creater: Landry
 * Create Date:2010-3-17
 * Commonents:
 * Version: 1.0
 */
package com.landry.encoding;

import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Project:ConvertTxtEncoding
 * Create Dat:2010-3-17
 * Modified Date:
 * Commonents:
 * @author Landry
 * @version 1.0
 */
public interface ExecuteConvertFile
{
	/**
	 * 执行文件编码转换
	 * 1、inFilename为标准文件时,outFilename可以为目录,即保存到此目录下;
	 * 也可以为文件名,即重命名保存
	 * 2、inFilename为目录时,outFilename必须为目录,即将源目录下的所有文件保存到目的路径下
	 * @param inFilename 源文件名
	 * @param outFilename 目的文件名
	 * @param encoding 要转换成的编码
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public void executeConvertFile (String inFilename, String outFilename,
			String encoding) throws FileNotFoundException, IOException;

	/**
	 * 设置包含的要进行处理的文件(扩展名),以"|"进行分隔
	 * 如果没有设置,则执行默认包含的文本文件:txt、ini、java、jsp、jspa、htm、html、xml、js、vbs、css、properties、ftl、php、asp
	 * @param fileExtName
	 */
	public void setInclude (String fileExtName);
}

 

实现类:
ConvertEncodingImpl.java

/**
 * FileName:EncodingConvertImpl.java
 * Creater: Landry
 * Create Date:2010-3-15
 * Commonents:
 * Version: 1.0
 */
package com.landry.encoding;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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.util.HashSet;

/**
 * Project:ConvertTxtEncoding
 * Create Dat:2010-3-15
 * Modified Date:
 * Commonents:
 * @author Landry
 * @version 1.0
 */
public class ConvertEncodingImpl implements ConvertEncoding
{
	/** 要进行处理的文件集合 */
	HashSet<String> include = new HashSet<String>();
	private final String defaultIncludeFile = "txt|ini|java|jsp|jspa|htm|html|xml|js|vbs|css|properties|ftl|php|asp";
	
	public ConvertEncodingImpl ()
	{
		// 如果没有设置要进行处理的文件,就执行默认包含的文件
		if (include.isEmpty())
		{
			setInclude(defaultIncludeFile);
		}
	}
	
	@Override
	public void setInclude (String fileExtName)
	{
		String[] arr = fileExtName.split("\\|");
		for (String name : arr)
		{
			include.add(name.trim());
		}
	}
	
	@Override
	public void convertEncoding (String inFilename, String outFilename,
			String encoding) throws FileNotFoundException, IOException
	{
		// 源文件
		File inFile = new File(inFilename);
		if (!inFile.exists())
		{
			System.out.println(inFile.getAbsolutePath() + "不存在");
			return;
		}
		// 目的文件
		File outFile = new File(outFilename);
		
		if (inFile.isDirectory())// 如果源路径是目录,则在目的路径创建目录后返回
		{
			outFile.mkdirs();
			return;
		}
		else
		{
			outFile.createNewFile();
			boolean isTxt = isTextFile(inFile);
			if (isTxt)// 如果是文本文件,进行编码转换
				convertEncodingProcess(inFilename, outFilename, encoding);
			else
				// 如果是非文本文件,直接复制
				copyBinaryFile(inFilename, outFilename);
		}
	}
	
	@Override
	public void convertEncodingProcess (String inFilename, String outFilename,
			String encoding) throws FileNotFoundException, IOException
	{
		File inFile = new File(inFilename);
		String currentEncoding = getFileCharacter(inFile);
		File outFile = new File(outFilename);
		
		BufferedReader reader = new BufferedReader(new InputStreamReader(
				new FileInputStream(inFile), currentEncoding));
		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
				new FileOutputStream(outFile), encoding));

		String str = "";
		while ((str = reader.readLine()) != null)
		{
			writer.write(str + "\r\n");
		}
		writer.flush();
		reader.close();
		writer.close();
	}
	
	@Override
	public void copyBinaryFile (String inFilename, String outFilename)
			throws FileNotFoundException, IOException

	{
		File inFile = new File(inFilename);
		File outFile = new File(outFilename);

		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				inFile));
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(outFile));
		
		byte[] data = new byte[1];
		while (bis.read(data) != -1)
		{
			bos.write(data);
		}
		bos.flush();
		bis.close();
		bos.close();
	}
	
	@Override
	public String getFileCharacter (File file) throws FileNotFoundException,
			IOException
	{
		
		CharsetDetector charDect = new CharsetDetector();
		FileInputStream fis = new FileInputStream(file);
		String[] probableSet = charDect.detectChineseCharset(fis);
		
		if (probableSet.length == 1)
		{
			if (probableSet[0].equals("x-euc-tw"))
			{
				return "GB2312";
			}
			else
			{
				return probableSet[0];
			}
		}
		else if (probableSet.length > 1)
		{
			for (String character : probableSet)
			{
				if (character.equals("GB2312"))
					return "GB2312";
				if (character.equals("UTF-8"))
					return "UTF-8";
				if (character.equals("ASCII"))
					return "ASCII";
			}
		}
		
		return null;
	}
	
	@Override
	public String getFileExtName (File file)
	{
		if (file.isDirectory())
			return null;
		String fullName = file.getName();
		int index = fullName.indexOf(".");
		return fullName.substring(index + 1);
	}
	
	@Override
	public boolean isTextFile (File file)
	{
		String extName = getFileExtName(file);
		return include.contains(extName);
	}
	
}

 
ExecuteConvertFileImpl.java

/**
 * FileName:ExecuteConvertFileImpl.java
 * Creater: Landry
 * Create Date:2010-3-17
 * Commonents:
 * Version: 1.0
 */
package com.landry.encoding;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Project:ConvertTxtEncoding
 * Create Dat:2010-3-17
 * Modified Date:
 * Commonents:
 * @author Landry
 * @version 1.0
 */
public class ExecuteConvertFileImpl implements ExecuteConvertFile
{
	/** 最开始的源文件 */
	private File srcFile;
	/** 最开始的目的地文件 */
	private File targetFile;
	/** 文件分隔符 */
	private final String separator = System.getProperties().getProperty(
			"file.separator");
	final ConvertEncoding convertEncoding = new ConvertEncodingImpl();

	@Override
	/**
	 * 设置包含的要进行处理的文件(扩展名),以"|"进行分隔
	 * 如果没有设置,则执行默认包含的文本文件:txt、ini、java、jsp、jspa、htm、html、xml、js、vbs、css、properties、ftl、php、asp
	 * @param fileExtName
	 */
	public void setInclude (String fileExtName)
	{
		convertEncoding.setInclude(fileExtName);
	}

	@Override
	public void executeConvertFile (String inFilename, String outFilename,
			String encoding) throws FileNotFoundException, IOException
	{
		srcFile = new File(inFilename);
		targetFile = new File(outFilename);
		if (!srcFile.exists())
		{
			System.out.println("源文件不存在:" + srcFile.getAbsolutePath());
			return;
		}
		execute(inFilename, outFilename, encoding);
	}
	
	/**
	 * 具体执行文件转换的操作
	 * @param inFilename
	 * @param outFilename
	 * @param encoding
	 * @throws IOException
	 * @throws FileNotFoundException
	 */
	private void execute (String inFilename, String outFilename, String encoding)
			throws FileNotFoundException, IOException
	{
		File inFile = new File(inFilename);
		if (!inFile.isDirectory())// 如果不是目录,即是标准文件
		{
			convertEncoding.convertEncoding(inFilename, outFilename, encoding);// 直接进行转换并保存
		}
		else
		{

			File outFile = new File(outFilename);
			outFile.mkdirs();// 创建相对应的目的目录

			String[] fileList = inFile.list();// 得到所有的子文件和目录
			for (String childFilename : fileList)
			{
				String srcChildFilename = getCurSrcFilename(inFile,
						childFilename);
				String targetChildFilename = getCurTargetFilename(inFile,
						childFilename);
				// 递归调用,扫描所有子目录
				execute(srcChildFilename, targetChildFilename, encoding);

			}
		}
	}
	
	/**
	 * 得到当前子文件的源路径
	 * @param parent 父目录
	 * @param childFilename
	 * @return
	 */
	private String getCurSrcFilename (File parent, String childFilename)
	{
		return parent.getAbsoluteFile() + separator + childFilename;
	}
	
	/**
	 * 得到当前子文件的目的路径
	 * @param parent 父目录
	 * @param childFilename
	 * @return
	 */
	private String getCurTargetFilename (File parent, String childFilename)
	{
		String parentFilename = parent.getAbsolutePath();
		int index = srcFile.getAbsolutePath().length();
		String relativePath = parentFilename.substring(index);
		String curTargetFilename = targetFile.getAbsolutePath() + separator
				+ relativePath + separator + childFilename;
		return curTargetFilename;
	}
}

 

具体应用:

ExecuteConvertFileTest.java

package com.landry.test;

import java.io.FileNotFoundException;
import java.io.IOException;

import com.landry.encoding.ExecuteConvertFile;
import com.landry.encoding.ExecuteConvertFileImpl;

public class ExecuteConvertFileTest
{
	public static void main (String[] args)
	{
		ExecuteConvertFile execute = new ExecuteConvertFileImpl();
		// 目录
		String inFilename = "D:\\tomcat6\\webapps\\";
		// 源文件为单个文件
		// String inFilename = "D:\\tomcat6\\webapps\\doc\\aio.html";
		String outFilename = "D:\\output";
		String encoding = "UTF-8";
		try
		{
			execute.executeConvertFile(inFilename, outFilename, encoding);
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
}

 

1
0
分享到:
评论
1 楼 gary_zg 2011-02-08  
真是好东西,刚好要做这件事,碰到你的工具,省了很多工作,太感谢了!

相关推荐

    Chrome网页编码转换工具

    Charset(Chrome网页编码转换工具)是一款简单易用、功能强大的chrome网页编码转换工具,主要能通过内置的二十多种网页编码,将网站设置不规范而出现乱码的网页转换编码使之成为能够浏览的页面,在安装了这款插件后,...

    基于python开发的编码转换工具,图形化界面基于pyside2(qt5)开发.zip

    基于python开发的编码转换工具,图形化界面基于pyside2(qt5)开发。 支持批量转换任意格式的文件编码; 可将文件编码转为UTF-8 BOM 、UTF-8、GB2312中的任意一种格式;.zip 基于python开发的编码转换工具,图形化...

    文件编码转换工具源码

    此工具的功能如下,目前仅能在windows平台...1、支持UTF8、Unicode、GB2312编码普通文本文件任意转换 2、支持UTF8、Unicode、GB2312编码html文件任意转换 3、支持对文件进行Base64编码 4、支持对Base64编码文件进行解码

    Base64编码转换工具

    在标题提到的“Base64编码转换工具”中,我们主要讨论的是一个用C#语言开发的小型应用程序,该程序能够方便地实现Base64编码与普通文本之间的相互转换。 Base64编码的基本原理是将每3个字节(24位)的数据分成4组,...

    Eclipse中文编码转换工具及使用说明.docx

    通过以上步骤,Eclipse的中文编码转换插件可以帮助你解决编码不兼容导致的乱码问题,确保你的代码和文本文件在各种环境下都能正确显示。记住,对于含有中文字符的项目,统一编码格式是避免乱码的关键,而Eclipse的这...

    wintool编码转换工具

    《全面解析“wintool编码转换工具”》 在信息技术领域,编码转换是日常工作中不可或缺的一部分,尤其...而wintool编码转换工具.exe文件正是实现这些功能的核心程序,下载并运行后,即可体验到这款强大工具带来的便利。

    任意进制转换工具.rar

    在网络通信中,数据传输通常会涉及二进制编码,这时转换工具能帮助解析和理解数据包。此外,它还能在日常计算中简化复杂运算,比如计算IP地址或理解计算机硬件的工作方式。 总之,进制转换是IT领域不可或缺的一部分...

    文件转换为Base64编码

    在文件转换为Base64编码的过程中,首先会读取文件的二进制内容,然后按照Base64的规则进行转换。这个过程包括分组、编码和填充三个步骤: 1. **分组**:每个8位字节的二进制数据被分为3个一组,如果文件长度不是3的...

    CTF Converter 编码转换

    5. 文件编码处理:不仅限于字符串,也可能处理整个文件的编码转换。 掌握这些编码转换技能和工具对于提升CTF比赛中的解题能力极其重要。通过实践和学习,参赛者可以更有效地应对各种编码难题,快速解锁隐藏的信息,...

    编码转换工具napkin

    "编码转换工具napkin"是一个专门用于进行编码转换的小型实用程序,它支持基础的base64编码和解码以及MD5散列计算。这些功能在日常开发、数据传输和安全验证中都有广泛应用。 首先,让我们来详细了解一下base64编码...

    txt文件编码批量转换器 V2.1版

    转换器的使用方法很简单,只需把你要转换的txt文件放到任意一个文件夹里面,然后运行txt文件编码批量转换器,选择你要转换的编码,然后点击选择文件夹按钮,在弹出窗口中选择你放txt文件的那个文件夹,然后确定。...

    适用于批量将任意文件转为base64编码的工具.zip

    总结而言,这个工具简化了文件Base64编码的过程,提供了批量转换和多种数据格式导出的支持,对于需要处理大量文件编码的IT从业者或者开发者来说,是一个非常实用的辅助工具。同时,其易用性和高效性也是提高工作效率...

    小葵多功能转换工具.zip

    小葵工具能进行SQL编码转换,有效保护数据库安全。 4. **十六进制(Hex)编码**:以二进制的16个可能值(0-9,A-F)表示每位数据。在编程和数据传输中,Hex编码常用于简化长字符串的表示。小葵工具的Hex转换功能,...

    编码进制多功能转换工具

    本文将深入探讨“编码进制多功能转换工具”所涉及的关键知识点。 首先,我们来理解“编码”。在计算机科学中,编码是指将人类可读的信息转化为计算机可以理解和处理的形式的过程。常见的编码方式包括ASCII、Unicode...

    基于python开发的编码转换工具,图形化界面基于pyside2(qt5)开发 支持批量转换任意格式的文件编码+源代码+文档说

    基于python开发的编码转换工具,图形化界面基于pyside2(也就是qt5)开发。 支持批量转换任意格式的文件编码; 可将文件编码转为UTF-8 BOM 、UTF-8、GB2312中的任意一种格式; src文件夹下是源码,exe...

    字符进制编码转换工具

    这里我们将深入探讨这些知识点,并结合提供的"字符进制编码转换工具"进行说明。 首先,让我们了解字符编码。在计算机中,所有的数据都是以二进制形式存储的,包括我们看到的文字。字符编码如ASCII(美国标准信息...

    BASE64编码转换工具

    **BASE64编码转换工具详解** 在信息技术领域,数据传输和存储时常会遇到编码转换的问题。其中,BASE64编码是一种广泛使用的编码方式,尤其在处理二进制数据转化为文本格式时,它起到了至关重要的作用。本文将深入...

    txt文件编码批量转换器

    所以,用C#编写了这个txt文件编码批量转换器 ,方便大家对大量文件进行转换编码。 使用方法很简单,只需把你要转换的txt文件放到任意一个文件夹里面,然后运 行txt文件编码批量转换器,选择你要转换的编码,然后...

Global site tag (gtag.js) - Google Analytics