首页>代码>java转换文本文件编码>/src/org/charsetconvert/CharsetConvertor.java
package org.charsetconvert;

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.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class CharsetConvertor {

	private String sourCharset;
	private final String destCharset;

	public CharsetConvertor(String destCharset) {
		this.destCharset = destCharset;
	}

	public CharsetConvertor(String sourCharset, String destCharset) {
		this.sourCharset = sourCharset;
		this.destCharset = destCharset;
	}

	public void convertFiles(String folderPath) {
		File folder = new File(folderPath);
		if (sourCharset == null)
			readCharsetFile(folder);
		else
			readFile(folder);
	}
	
	/**
	 * 读取目录
	 * @param folder
	 */
	private void readFile(File folder) {
		File[] files = folder.listFiles();
		for (File file : files) {
			if (file.isDirectory())
				readFile(file);//递归读取目录
			else
				convertFile(file);//转换编码
		}
	}

	/**
	 * 如果没有指定文件编码则自动获取文件编码,然后进行转码
	 * @param folder
	 */
	private void readCharsetFile(File folder) {
		File[] files = folder.listFiles();
		try {
			for (File file : files) {
				if (file.isDirectory()) {
					readCharsetFile(file);
				} else {
					//获取当前文件编码
					this.sourCharset = new CharsetDetector()
							.detectChineseCharset(new FileInputStream(file))[0];
					//如果文件已经是要转换的编码则不转码
					if(sourCharset.equals(destCharset))
						continue;
					else
						convertFile(file);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 按指定编码读取文件并转换编码
	 * @param file
	 */
	public void convertFile(File file) {
		InputStream input = null;
		// FileInputStream fileInput = null;
		InputStreamReader inputReader = null;
		BufferedReader buffReader = null;

		OutputStream output = null;
		// FileOutputStream fileOutput = null;
		OutputStreamWriter outputWriter = null;
		BufferedWriter buffWriter = null;
		File tempFile = null;
		try {
			// System.out.println(sourCharset);
			
			// tempFile =
			// File.createTempFile(file.getName()+"."+sourCharset+"to"+destCharset+".",
			// ".tmp", file.getParentFile());
			tempFile = File.createTempFile(file.getName() + ".", ".tmp",
					file.getParentFile());
			// System.out.println(file);
			// System.out.println(tempFile);
			// new File(file.getName() + ".tmp").createNewFile();
			
			// 创建输入输出流
			input = new FileInputStream(file);
			//以指定编码读取文件
			inputReader = new InputStreamReader(input, sourCharset);
			buffReader = new BufferedReader(inputReader);

			output = new FileOutputStream(tempFile);
			//以指定编码输出文件
			outputWriter = new OutputStreamWriter(output, destCharset);
			buffWriter = new BufferedWriter(outputWriter);

			String temp;

			// 读取文件
			while ((temp = buffReader.readLine()) != null) {
				// System.out.println("//////////////////////////////////////////");
				// System.out.println(temp);
				// temp = new String(temp.getBytes(sourCharset), destCharset);
				// System.out.println(temp);
				// 写入数据,如果读取带BOM的UTF-8编码文件,则忽略BOM头
				buffWriter.write(temp);
				buffWriter.newLine();
				// 刷新
				buffWriter.flush();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 关闭流
			try {
				if (output != null)
					output.close();
				if (buffWriter != null)
					buffWriter.close();
				if (outputWriter != null)
					outputWriter.close();
				if (input != null)
					input.close();
				if (buffReader != null)
					buffReader.close();
				if (inputReader != null)
					inputReader.close();
				//将源文件替换为修改后的文件
				if (file.delete()) { // 执行完buffReader.close() 之后才能删除文件
					tempFile.renameTo(file);
				}
				System.out.println("已将文件"+file+"由"+sourCharset+"编码转换为"+destCharset+"编码");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}
最近下载更多
WHY-small  LV15 2022年11月3日
2469095052  LV8 2021年2月2日
xwj123789  LV1 2020年4月1日
fenglin218  LV11 2019年6月21日
二两小面加个蛋  LV10 2019年3月18日
love9971  LV1 2018年12月11日
seedgiid  LV2 2018年3月21日
wangdongchun  LV8 2018年3月12日
keen1066  LV17 2017年12月13日
复制三次胖狗  LV7 2017年12月6日
最近浏览更多
whhano  LV2 2023年12月20日
1358849392  LV21 2023年6月6日
WHY-small  LV15 2022年11月3日
nothing 2021年11月22日
暂无贡献等级
a14628909  LV4 2021年5月14日
2469095052  LV8 2021年2月2日
rainylan_er 2020年4月4日
暂无贡献等级
writerdreamer  LV1 2020年4月4日
xwj123789  LV1 2020年4月1日
suhuike 2020年2月19日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友