March 18th, 2008批量文本编码转换程序源码
公司的java项目一开始为了和php的编码保存统一而采用了GBK,但是现在发现越来越多不方便的地方,于是决定全部转向UTF-8。为了能够把已写的源代码全转化到utf-8下,我写了一下小程序,用groovy写的。由于groovy学得还不够好,所以写出程序太java了。程序会把指定目录下的所有的文件都按照指定编码的方式读入,再以指定编码的方式写回到别外的目录里。代码如下:
import java.nio.charset.Charset; public class Main{ public static void main(String[] args) { if(args.length != 4) { println("Useage: convertEncoding fileName toDir fromEncoding" +"toEncoding") } def file = new File(args[0]) def toFile = new File(args[1]) def fromEncoding = args[2] def toEncoding = args[3] convert(file, toFile, fromEncoding, toEncoding) } public static void convert(File fromFile, File toFile, String fromEncoding, String toEncoding) { if(!fromFile.exists()) return; if(!fromFile.isDirectory()) { BufferedReader reader = null; BufferedWriter writer = null; if(fromEncoding == null || !Charset.isSupported(fromEncoding)) { reader = new BufferedReader(new InputStreamReader (new FileInputStream(fromFile))) } else { reader = new BufferedReader(new InputStreamReader (new FileInputStream(fromFile), fromEncoding)) } if(toEncoding == null || !Charset.isSupported(toEncoding)) { writer = new BufferedWriter(new OutputStreamWriter (new FileOutputStream(toFile))) } else { writer = new BufferedWriter(new OutputStreamWriter (new FileOutputStream(toFile), toEncoding)) } String line = "" while(line != null) { line = reader.readLine() if(line == null) break; writer.write(line+"\r\n"); } reader.close(); writer.flush(); writer.close(); } else { File[] files = fromFile.listFiles(); for(File file : files) { if(file.isDirectory()) { if(file.name == ".svn") { continue } File toSubDir = new File(toFile, file.getName()) if(!toSubDir.mkdir()) { println("create subdir : ${toSubDir} fail") } else { println("create subdir : ${toSubDir}") } convert(file, toSubDir, fromEncoding, toEncoding); } else { if( !file.name.endsWith(".java") && !file.name.endsWith(".xhtml") && !file.name.endsWith(".xml") && !file.name.endsWith(".txt") ) { continue; } File toNewFile = new File(toFile, file.name) convert(file, toNewFile, fromEncoding, toEncoding) println("File : ${file.absolutePath} converted " + "to ${toNewFile.absolutePath} "); } } } } }