Java文本字符集转换实用类

eclipe可设置代码文件字符集,比如utf-8。若遇到gbk编码的文件,显示中文时就会乱码,此类可以将文件转换成utf-8编码。
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import org.springframework.util.FileCopyUtils;

/**
 * 文本文件字符编码转换器
 */
public class CharsetConverter {
	private String srcDir;
	private String destDir;
	private FileFilter filter;

	/**
	 * 构造器(对所有类型的文件做转换)
	 * 
	 * @param srcDir
	 *            源文件所在目录
	 * @param destDir
	 *            转换后的文件存放目录
	 */
	public CharsetConverter(String srcDir, String destDir) {
		this(srcDir, destDir, "*");
	}

	/**
	 * 构造器
	 * 
	 * @param srcDir
	 *            源文件所在目录
	 * @param destDir
	 *            转换后的文件存放目录
	 * @param fileTypes
	 *            文件类型(根据后缀来判断)类别,逗号(<code>,</code>)分隔。<code>"*" </code>表示所有的类型
	 */
	public CharsetConverter(String srcDir, String destDir, String fileTypes) {
		super();
		this.srcDir = srcDir;
		this.destDir = destDir;
		this.filter = getFileFilter(Arrays.asList(fileTypes.toLowerCase()
				.split(",")));
	}

	/**
	 * 取得文件类型过滤器
	 */
	private FileFilter getFileFilter(final List<String> fileTypes) {
		return new FileFilter() {
			String getType(File file) {
				String name = file.getName();
				return name.substring(name.lastIndexOf(".") + 1).toLowerCase();
			}

			@Override
			public boolean accept(File file) {
				if (file.isHidden())
					return false;

				return file.isDirectory() || fileTypes.contains(getType(file))
						|| fileTypes.contains("*");
			}
		};
	}

	/**
	 * 执行转换
	 * 
	 * @param fromCharset
	 *            原文件字符集
	 * @param toCharset
	 *            转换后的字符集
	 * @throws IOException
	 */
	public void convert(String fromCharset, String toCharset)
			throws IOException {
		this.convert(new File(srcDir), fromCharset, toCharset);
	}

	/**
	 * 转换单个文件
	 * 
	 * @param fromCharset
	 *            原文件字符集
	 * @param toCharset
	 *            转换后的字符集
	 * @throws IOException
	 */
	private void convert(File file, String fromCharset, String toCharset)
			throws IOException {
		if (file.isDirectory()) {
			for (File f : file.listFiles(this.filter)) {
				convert(f, fromCharset, toCharset);
			}
			return;
		}

		System.out.println(file.getAbsolutePath());
		String to = destDir + "/"
				+ file.getAbsolutePath().substring(srcDir.length());
		File dir = new File(to.substring(0, to.replaceAll("\\\\", "/")
				.lastIndexOf("/")));
		if (!dir.exists())
			dir.mkdirs();

		byte[] bytes = FileCopyUtils.copyToByteArray(file);
		FileCopyUtils.copy(new String(bytes, fromCharset).getBytes(toCharset),
				new File(to));
	}

	public static void main(String[] args) throws Exception {
		if (args.length < 5) {
			System.out
					.println("Usage: java CharsetConverter <srcDir> <destDir> <fileTypes|*> <fromCharset> <toCharset>");
			System.out
					.println("e.g. java CharsetConverter i:/src i:/dest java,txt gbk utf-8");
			// System.exit(0);
			args = new String[] { "i:/src", "i:/dest", "java", "gbk", "utf-8" };
		}
		new CharsetConverter(args[0], args[1], args[2]).convert(args[3],
				args[4]);
	}
}

你可能感兴趣的:(charset,字符集)