java整个项目自动编码转换,欢迎使用,哈哈

项目开发中难免出现编码问题,网上查了一个eclipse插件com.lifesting.tool.encoding,不知道什么原因把我项目弄的一片混乱。

 

痛定思痛,自己写了一个,只要在项目中调用并运行一下Transcoding类就可以了,会自动把项目编码转换成指定的编码,同时会备份项目文件

 

自动检测编码用的是网上的BytesEncodingDetect类,觉得检测的准确度还是可以的,欢迎大家测试或使用

 

Transcoding类:

 

public class Transcoding {

	private BytesEncodingDetect encode = new BytesEncodingDetect();
	private String projectPath = System.getProperty("user.dir");// 获取项目目录
	private File tempPath = null;// 转码备份区,用来备份,注意:每次使用前会自动清空
	private String suf = null;
	private String newCharset = null;

	public Transcoding() {
		// 针对windows目录,linux请自行修改
		String proPath = projectPath.substring(projectPath.lastIndexOf("\\") + 1);
		String temp_path = "D:/备份/" + proPath;
		tempPath = new File(temp_path);// 转码备份区,可自行修改
		if (!tempPath.exists()) {
			tempPath.mkdirs();
		} else {
			delete(tempPath);// 注意:每次使用前会自动清空
		}
	}

	/**
	 * 把当前项目复制一份到转码备份区
	 */
	private void backUp(File srcPath, File dstPath) {
		if (srcPath.isDirectory()) {
			if (!dstPath.exists()) {
				dstPath.mkdirs();
			}
			String files[] = srcPath.list();
			for (int i = 0; i < files.length; i++) {
				backUp(new File(srcPath, files[i]), new File(dstPath, files[i]));
			}
		} else {
			if (!srcPath.exists()) {
				System.out.println("File or directory does not exist.");
				System.exit(0);
			} else {
				try {
					InputStream in = new FileInputStream(srcPath);
					OutputStream out = new FileOutputStream(dstPath);
					byte[] b = new byte[1024];
					int len = 0;
					while ((len = in.read(b)) != -1) {
						out.write(b, 0, len);
					}
					in.close();
					out.close();
				} catch (Exception e) {
					e.printStackTrace();// 一旦出错,根据信息自己找原因吧
					System.out.println(srcPath.getAbsolutePath() + " " + dstPath.getAbsolutePath());
				}
			}
		}
	}

	/**
	 * 用转码备份区文件转码后覆盖项目
	 */
	private void convert(File srcPath, File dstPath) {
		if (srcPath.isDirectory()) {
			if (!dstPath.exists()) {
				dstPath.mkdirs();
			}
			String files[] = srcPath.list();
			for (int i = 0; i < files.length; i++) {
				convert(new File(srcPath, files[i]), new File(dstPath, files[i]));
			}
		} else {
			if (!srcPath.exists()) {
				System.out.println("File or directory does not exist.");
				System.exit(0);
			} else {
				//只转码指定后缀的文件
				if (!srcPath.getName().toLowerCase().endsWith(suf)) {
					return;
				}
				try {
					// 获取文件编码
					String charset = BytesEncodingDetect.javaname[encode.detectEncoding(srcPath)];
					//编码相同,无需转码
					if (charset.equalsIgnoreCase(newCharset)) {
						return;
					}
					InputStream in = new FileInputStream(srcPath);
					OutputStream out = new FileOutputStream(dstPath, false);
					BufferedReader br = new BufferedReader(new InputStreamReader(in, charset));
					BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out, newCharset));
					while (br.ready()) {
						bw.append(br.readLine());
						bw.newLine();
					}
					br.close();
					bw.close();
				} catch (Exception e) {
					e.printStackTrace();
					System.out.println(srcPath.getAbsolutePath() + " " + dstPath.getAbsolutePath());
				}
			}
		}
	}

	/**
	 * 删除目录
	 */
	private void delete(File file) {
		if (file.isDirectory()) {
			File[] list = file.listFiles();
			for (File f : list) {
				delete(f);
			}
			file.delete();
		} else {
			file.delete();
		}
	}

	/**
	 * 对当前项目进行转码,会把当前项目覆盖
	 * suf:规定要转码的文件后缀;charset:规定要转的编码
	 */
	public void encoding(String suf, String charset) {
		this.suf = suf;
		newCharset = charset;
		backUp(new File(projectPath), tempPath);
		convert(tempPath, new File(projectPath));
		System.out.println("encoding successfully!");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Transcoding().encoding("java", "utf-8");

	}

}

你可能感兴趣的:(java,eclipse,windows,linux,F#)