昨天因为svn更新时出错,导致了所有的包含中文的java文件出现乱码,用记事本读取中文显示正常,但用eclipse就显示错误,导致问题出现的原因是编码问题,于是写了一个java类,遍历文件夹里所有的java类,并且将其转换成utf-8编码。具体代码如下:
/**
* 处理学习元乱码问题
*
* @author 丁国柱 2012-11-22
*/
public class ParseFile2UFT8 {
private static ArrayList<String> filelist = new ArrayList<String>();
public static void main(String[] args) throws Exception {
String filePath = "F:/program/Lcell/src";
// getFiles(filePath);
String fileName = "";
List<String> fileList = getFiles(filePath);
System.out.println("一共有" + fileList.size() + "个文件");
for (int i = 0; i < fileList.size(); i++) {
// convertFiles(fileList.get(i),);
// System.out.println(fileList.get(i));
// convertFiles(fileList.get(i).toString(),changeFilePath(fileList.get(i).toString()));
fileName = fileList.get(i).toString();
System.out.println("处理第" + i + 1 + "个文件:" + fileName);
convertFiles(fileName, changeFilePath(fileName));
}
// System.out.println(changeFilePath("F:/program/Lcell/src/TestHellp.java"));
}
/*
* 通过递归得到某一路径下所有的目录及其文件
*/
static List<String> getFiles(String filePath) {
File root = new File(filePath);
File[] files = root.listFiles();
for (File file : files) {
if (file.isDirectory()) {
/*
* 递归调用
*/
getFiles(file.getAbsolutePath());
} else {
// 只要后缀名为java的文件
if (file.getAbsolutePath()
.substring(file.getAbsolutePath().length() - 5,
file.getAbsolutePath().length())
.equals(".java")) {
filelist.add(file.getAbsolutePath());
}
}
}
return filelist;
}
public static void convertFiles(String inputFilePath, String outputFilePath) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(new File(inputFilePath));
fos = new FileOutputStream(new File(outputFilePath));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
String str = new String(buffer, "GBK");
fos.write(str.getBytes("utf-8"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (Exception e) {
}
}
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
}
}
}
}
/**
* 改变存储路径F:/program/Lcell/src/TestHellp.java
* ==>F:/program/Lcell/convert/TestHellp.java
*
* @param filePath
* @return
*/
public static String changeFilePath(String filePath) {
int index = filePath.lastIndexOf("\\src");
String newFilePath = filePath.substring(0, index) + "_convert"
+ filePath.substring(index, filePath.length());
// if(File(newFilePath))
File file = new File(newFilePath);
if (!file.getParentFile().exists()) {
System.out.println("目标文件所在路径不存在,准备创建:" + file.getParentFile()
+ "目录");
if (!file.getParentFile().mkdirs()) {
System.out.println("创建目录文件所在的目录失败!");
}
}
return newFilePath;
}
// 根据文件名判断是否utf-8编码
public static boolean fileIsUTF8Encoding(FileInputStream in) {
boolean isUtf8 = false;
try {
byte[] b = new byte[3];
try {
in.read(b);
in.close();
if (b[0] == -17 && b[1] == -69 && b[2] == -65) {
// 是utf-8编码
isUtf8 = true;
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return isUtf8;
}
}