昨天把提取搞定了,替换的代码也写好了,只是没有完全调试成功,原因是Map中的key 是 String,而我用的是 StringBuilder,没有显示的转换为String,这作为一个Map的key,是不会报错的,虽然已经范型过了,这可能也是java的容器类与范型结合,还没解决的问题吧。
现在把所有代码全部贴出来,如有朋友遇到同类问题,可以作为参考。
注:需要jxl的jar包,我的jdk是1.6的,1.5的应该也行跑
自己写的工具类:
package com.hc;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
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.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jxl.Sheet;
import jxl.Workbook;
public class Util {
// 判断一个unicode码是不是中文
public static boolean isChinese(int charInt) {
if (charInt > 19967 && charInt < 40870) {
return true;
} else {
return false;
}
}
// 字节流转换成字符流,同时转换编码
public static BufferedReader changeEncoding(File file)
throws FileNotFoundException, UnsupportedEncodingException {
FileInputStream fin = new FileInputStream(file);
InputStreamReader in = new InputStreamReader(fin, "gb2312");
BufferedReader br = new BufferedReader(in);
return br;
}
// 得到该文件夹,及其所有子文件夹下的所有目标文件
public static List<File> getAllFiles(File file) {
List<File> valueFiles = new ArrayList<File>();
File[] fs = file.listFiles();
for (int i = 0; i < fs.length; i++) {
if (fs[i].isDirectory()) {
// 递归得到每个子文件夹下的目标文件
valueFiles.addAll(getAllFiles(fs[i]));
}
}
// 把file文件夹下的目标文件放进去
valueFiles.addAll(Arrays.asList(getFiles(file)));
return valueFiles;
}
// 得到一个文件夹下的目标文件,不包括子文件夹
private static File[] getFiles(File file) {
// 图个方便,用匿名类了
FileFilter filter = new FileFilter() {
String regex = "\\w*\\.jsp";
public boolean accept(File pathname) {
return pathname.getName().matches(regex);// 文件后缀为.jsp
}
};
File[] fs = file.listFiles(filter);
return fs;
}
// 提取某一文件中的所有中文
public static List<String> getChinese(File file) {
try {
List<String> valueList = new ArrayList<String>();
BufferedReader charArrayReader = Util.changeEncoding(file);
int i = -1;
StringBuilder sBuilder = new StringBuilder();
do {
i = charArrayReader.read();
// System.out.print((char)i);
// 如果是中文
if (Util.isChinese(i)) {
sBuilder.append((char) i);
}
// 如果不是中 文
else {
// 如果是中文 后的第一个
if (sBuilder.length() > 0) {
// 把中文加进去
valueList.add(sBuilder.toString());
// 清除Builder里面的中文
sBuilder.delete(0, sBuilder.length());
}
// 如果不是中文的结束,什么都不用做
}
} while (i != -1);
System.out.println(valueList.size());
return valueList;
} catch (Exception e) {
// 不做异常处理
return null;
}
}
// 把excel里面的中英文读进来,维护成一个map
public static Map<String, String> getMap() {
try {
File file = new File("E:/FirstWork/中文.xls");
// 怀疑编码有问题,写的调试代码,实事上,没有用到
// InputStream inputStream = new FileInputStream(file);
// WorkbookSettings workbookSettings = new WorkbookSettings();
// workbookSettings.setEncoding("utf-8");
Workbook workbook = Workbook.getWorkbook(file);
Sheet sheet = workbook.getSheet(0);
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < sheet.getRows(); i++) {
// System.out.println(sheet.getCell(0,
// i).getContents()+" "+sheet.getCell(1, i).getContents());
// new String(sheet.getCell(0,
// i).getContents().getBytes("UTF-8"),"gb2312")
// map.put(new String(sheet.getCell(0,
// i).getContents().getBytes("utf-16le"),"gb2312"), new
// String(sheet.getCell(0,
// i).getContents().getBytes("UTF-8"),"gb2312"));
map.put(sheet.getCell(0, i).getContents(), sheet.getCell(1, i)
.getContents());
}
return map;
} catch (Exception e) {
e.printStackTrace();
// 不做异常处理了。。。
return null;
}
}
// 修改一个文件中的中文
public static void editFile(File file, Map<String, String> map) {
try {
BufferedReader charArrayReader = Util.changeEncoding(file);
int i = -1;
StringBuilder newFileString = new StringBuilder();
StringBuilder changeWord = new StringBuilder();
do {
i = charArrayReader.read();
// System.out.print((char)i);
// 如果是中文
if (Util.isChinese(i)) {
changeWord.append((char) i);
}
// 如果不是中 文
else {
// 如果是中文 后的第一个
if (changeWord.length() > 0) {
// 把中文加进去
// System.out.println(changeWord+" "+map.get(changeWord.toString()));
// 特别注意:key 是String,StringBuilder 要显示的转为String
// ,不会自动调用toString方法的。
// 这是我直到最后才怀疑的地方
newFileString.append(map.get(changeWord.toString()));
// 清除changeWordBuilder里面的中文
changeWord.delete(0, changeWord.length());
}
// 如果不是中文的结束,什么都不用做
// 把非中文放进去
newFileString.append((char) i);
}
} while (i != -1);
Util.writeBack(file, newFileString.toString());
} catch (Exception e) {
// 不做异常处理
e.printStackTrace();
}
}
private static void writeBack(File file, String string) throws IOException {
// 字节流
FileOutputStream fout = new FileOutputStream(file);
// 字符流
OutputStreamWriter out = new OutputStreamWriter(fout, "gb2312");
BufferedWriter bw = new BufferedWriter(out);
bw.write(string);
bw.flush();
bw.close();
}
}
下面就是调用了:
package com.hc;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class Test {
// // 取JSP页面中所有的中文
// public static void main(String[] args) {
// // 该文件夹下的所有目标文件
// File file = new File("E:/FirstWork/rgsZS/webcontext/");
//
// // 得到所有目标文件
// List<File> fileList = Util.getAllFiles(file);
// System.out.println("共有JSP文件:" + fileList.size() + "个");
//
// // 提取所有文件中的中文
// List<String> strList = new ArrayList<String>();
// for (File file2 : fileList) {
// strList.addAll(Util.getChinese(file2));
// }
//
// // 把提取出来的中文打出来
// for (String string : strList) {
// System.out.println(string);
// }
//
// }
// 从excel读出中文和对应的英文,并写入所有的JSP文件
public static void main(String[] args) {
Map<String, String> map = Util.getMap();
System.out.println(map.size());
System.out.println(map.keySet());
// 该文件夹下的所有目标文件
File file = new File("E:/FirstWork/rgsZS/webcontext/");
// 得到所有目标文件
List<File> fileList = Util.getAllFiles(file);
System.out.println("共有JSP文件:" + fileList.size() + "个");
// 修改所有文件中的中文
for (File file2 : fileList) {
Util.editFile(file2, map);
}
}
}