昨天把提取搞定了,替换的代码也写好了,只是没有完全调试成功,原因是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);
- }
- }
- }