最近都在看别人的一些代码,其中中苦恼的是将别人写的工程导入Eclipse里的时候,java文件出现了乱码。因为工程的原始编码是GBK的,但是我一般使用的是UTF-8的编码,结果就会出现编码不一致,出现代码乱码的情况。
也试过几种方法比如在eclipse中修改文件的编码,虽然在显示时是解决了乱码的问题,但是在运行时就会出现乱码情况,我新建的文件是UTF-8,原来导入的又是GBK,所以就会出现乱码。
最笨的方法就是将GBK的文件用记事本打开,一个一个copy到eclipse里,这个方法是可行的,可以解决编码问题,但是一但文件多起来,这个方法就是一件很累人的事情了。。。。
一气之下决定写个程序来实现自动转换编码的方法,其实想想也是很简单的,只不过是让机器帮我们实现记事本打开然后copy到别一个UTF-8文件的过程。
?
废话不多说,直接上代码吧:
package com.buptsse.ate.utils; import java.io.BufferedReader;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.io.UnsupportedEncodingException;import java.io.Writer;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern; /** * * @author linzhe * @email m23linzhe@gmail.com * @date 2012-5-23 */public class ConverEncoding { /** * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String srcDir = "E:\\mining\\tools\\ictclas4j\\ictclas4j\\src"; List<String> files = new ArrayList<String>(); fetchFileList(srcDir, files, ".java"); for(String fileName : files){ convert(fileName, "GBK", fileName, "UTF-8"); } } public static void convert(String oldFile, String oldCharset, String newFlie, String newCharset){ BufferedReader bin; FileOutputStream fos; StringBuffer content = new StringBuffer(); try { System.out.println(oldFile); bin = new BufferedReader(new InputStreamReader(new FileInputStream(oldFile), "gbk")); String line = null; while((line=bin.readLine())!=null){// System.out.println("content:" + content); content.append(line); content.append(System.getProperty("line.separator")); } bin.close(); File dir = new File(newFlie.substring(0, newFlie.lastIndexOf("\\"))); if(!dir.exists()){ dir.mkdirs(); } fos = new FileOutputStream(newFlie); Writer out = new OutputStreamWriter(fos, newCharset); out.write(content.toString()); out.close(); fos.close(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void fetchFileList(String strPath, List<String> filelist, final String regex) { File dir = new File(strPath); File[] files = dir.listFiles(); Pattern p = Pattern.compile(regex); if (files == null) return; for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { fetchFileList(files[i].getAbsolutePath(), filelist, regex); } else { String strFileName = files[i].getAbsolutePath().toLowerCase(); Matcher m = p.matcher(strFileName); if(m.find()){ filelist.add(strFileName); } } } } }
?
注释就没有多写了,基本的思想都在上面表述完成了。
可能有的朋友会问为什么要写到原来的文件里,也许你自己试试就能发现其中的原因,哈哈。
因为windows是不区分大小写的,所以如果写到一个新的文件里的话就会自动的将文件名字转成了小写,但是java里的类名一般可是大写的,哈哈,到此转换方法完成。
引用