用Java的I/O批量替换某一文件夹下(包括其子文件夹)所有JSP文件中的中文为英文

来源:互联网 发布:windows phone软件 编辑:程序博客网 时间:2024/06/09 20:00

昨天把提取搞定了,替换的代码也写好了,只是没有完全调试成功,原因是Map中的key 是 String,而我用的是 StringBuilder,没有显示的转换为String,这作为一个Map的key,是不会报错的,虽然已经范型过了,这可能也是java的容器类与范型结合,还没解决的问题吧。

现在把所有代码全部贴出来,如有朋友遇到同类问题,可以作为参考。

 

注:需要jxl的jar包,我的jdk是1.6的,1.5的应该也行跑

 

自己写的工具类:

 

Java代码 
  1. package com.hc;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.BufferedWriter;  
  5. import java.io.File;  
  6. import java.io.FileFilter;  
  7. import java.io.FileInputStream;  
  8. import java.io.FileNotFoundException;  
  9. import java.io.FileOutputStream;  
  10. import java.io.IOException;  
  11. import java.io.InputStreamReader;  
  12. import java.io.OutputStreamWriter;  
  13. import java.io.UnsupportedEncodingException;  
  14. import java.util.ArrayList;  
  15. import java.util.Arrays;  
  16. import java.util.HashMap;  
  17. import java.util.List;  
  18. import java.util.Map;  
  19.   
  20. import jxl.Sheet;  
  21. import jxl.Workbook;  
  22.   
  23. public class Util {  
  24.   
  25.     // 判断一个unicode码是不是中文  
  26.     public static boolean isChinese(int charInt) {  
  27.         if (charInt > 19967 && charInt < 40870) {  
  28.             return true;  
  29.         } else {  
  30.             return false;  
  31.         }  
  32.     }  
  33.   
  34.     // 字节流转换成字符流,同时转换编码  
  35.     public static BufferedReader changeEncoding(File file)  
  36.             throws FileNotFoundException, UnsupportedEncodingException {  
  37.         FileInputStream fin = new FileInputStream(file);  
  38.         InputStreamReader in = new InputStreamReader(fin, "gb2312");  
  39.         BufferedReader br = new BufferedReader(in);  
  40.         return br;  
  41.     }  
  42.   
  43.     // 得到该文件夹,及其所有子文件夹下的所有目标文件  
  44.     public static List<File> getAllFiles(File file) {  
  45.         List<File> valueFiles = new ArrayList<File>();  
  46.         File[] fs = file.listFiles();  
  47.         for (int i = 0; i < fs.length; i++) {  
  48.             if (fs[i].isDirectory()) {  
  49.                 // 递归得到每个子文件夹下的目标文件  
  50.                 valueFiles.addAll(getAllFiles(fs[i]));  
  51.             }  
  52.         }  
  53.         // 把file文件夹下的目标文件放进去  
  54.         valueFiles.addAll(Arrays.asList(getFiles(file)));  
  55.         return valueFiles;  
  56.     }  
  57.   
  58.     // 得到一个文件夹下的目标文件,不包括子文件夹  
  59.     private static File[] getFiles(File file) {  
  60.         // 图个方便,用匿名类了  
  61.         FileFilter filter = new FileFilter() {  
  62.             String regex = "//w*//.jsp";  
  63.   
  64.             public boolean accept(File pathname) {  
  65.                 return pathname.getName().matches(regex);// 文件后缀为.jsp  
  66.             }  
  67.         };  
  68.         File[] fs = file.listFiles(filter);  
  69.         return fs;  
  70.     }  
  71.   
  72.     // 提取某一文件中的所有中文  
  73.     public static List<String> getChinese(File file) {  
  74.         try {  
  75.             List<String> valueList = new ArrayList<String>();  
  76.             BufferedReader charArrayReader = Util.changeEncoding(file);  
  77.             int i = -1;  
  78.             StringBuilder sBuilder = new StringBuilder();  
  79.             do {  
  80.                 i = charArrayReader.read();  
  81.                 // System.out.print((char)i);  
  82.   
  83.                 // 如果是中文  
  84.                 if (Util.isChinese(i)) {  
  85.                     sBuilder.append((char) i);  
  86.                 }  
  87.                 // 如果不是中 文  
  88.                 else {  
  89.                     // 如果是中文 后的第一个  
  90.                     if (sBuilder.length() > 0) {  
  91.                         // 把中文加进去  
  92.                         valueList.add(sBuilder.toString());  
  93.   
  94.                         // 清除Builder里面的中文  
  95.                         sBuilder.delete(0, sBuilder.length());  
  96.                     }  
  97.                     // 如果不是中文的结束,什么都不用做  
  98.                 }  
  99.             } while (i != -1);  
  100.             System.out.println(valueList.size());  
  101.             return valueList;  
  102.         } catch (Exception e) {  
  103.             // 不做异常处理  
  104.             return null;  
  105.         }  
  106.   
  107.     }  
  108.   
  109.     // 把excel里面的中英文读进来,维护成一个map  
  110.     public static Map<String, String> getMap() {  
  111.         try {  
  112.             File file = new File("E:/FirstWork/中文.xls");  
  113.             // 怀疑编码有问题,写的调试代码,实事上,没有用到  
  114.             // InputStream inputStream = new FileInputStream(file);  
  115.             // WorkbookSettings workbookSettings = new WorkbookSettings();  
  116.             // workbookSettings.setEncoding("utf-8");  
  117.             Workbook workbook = Workbook.getWorkbook(file);  
  118.             Sheet sheet = workbook.getSheet(0);  
  119.             Map<String, String> map = new HashMap<String, String>();  
  120.             for (int i = 0; i < sheet.getRows(); i++) {  
  121.                 // System.out.println(sheet.getCell(0,  
  122.                 // i).getContents()+" "+sheet.getCell(1, i).getContents());  
  123.                 // new String(sheet.getCell(0,  
  124.                 // i).getContents().getBytes("UTF-8"),"gb2312")  
  125.                 // map.put(new String(sheet.getCell(0,  
  126.                 // i).getContents().getBytes("utf-16le"),"gb2312"), new  
  127.                 // String(sheet.getCell(0,  
  128.                 // i).getContents().getBytes("UTF-8"),"gb2312"));  
  129.                 map.put(sheet.getCell(0, i).getContents(), sheet.getCell(1, i)  
  130.                         .getContents());  
  131.             }  
  132.             return map;  
  133.         } catch (Exception e) {  
  134.             e.printStackTrace();  
  135.             // 不做异常处理了。。。  
  136.             return null;  
  137.         }  
  138.   
  139.     }  
  140.   
  141.     // 修改一个文件中的中文  
  142.     public static void editFile(File file, Map<String, String> map) {  
  143.         try {  
  144.             BufferedReader charArrayReader = Util.changeEncoding(file);  
  145.             int i = -1;  
  146.             StringBuilder newFileString = new StringBuilder();  
  147.             StringBuilder changeWord = new StringBuilder();  
  148.             do {  
  149.                 i = charArrayReader.read();  
  150.                 // System.out.print((char)i);  
  151.   
  152.                 // 如果是中文  
  153.                 if (Util.isChinese(i)) {  
  154.                     changeWord.append((char) i);  
  155.                 }  
  156.                 // 如果不是中 文  
  157.                 else {  
  158.                     // 如果是中文 后的第一个  
  159.                     if (changeWord.length() > 0) {  
  160.                         // 把中文加进去  
  161.                         // System.out.println(changeWord+" "+map.get(changeWord.toString()));  
  162.   
  163.                         // 特别注意:key 是String,StringBuilder 要显示的转为String  
  164.                         // ,不会自动调用toString方法的。  
  165.                         // 这是我直到最后才怀疑的地方  
  166.                         newFileString.append(map.get(changeWord.toString()));  
  167.                         // 清除changeWordBuilder里面的中文  
  168.                         changeWord.delete(0, changeWord.length());  
  169.                     }  
  170.                     // 如果不是中文的结束,什么都不用做  
  171.                     // 把非中文放进去  
  172.                     newFileString.append((char) i);  
  173.                 }  
  174.             } while (i != -1);  
  175.             Util.writeBack(file, newFileString.toString());  
  176.         } catch (Exception e) {  
  177.             // 不做异常处理  
  178.             e.printStackTrace();  
  179.         }  
  180.   
  181.     }  
  182.   
  183.     private static void writeBack(File file, String string) throws IOException {  
  184.         // 字节流  
  185.         FileOutputStream fout = new FileOutputStream(file);  
  186.         // 字符流  
  187.         OutputStreamWriter out = new OutputStreamWriter(fout, "gb2312");  
  188.         BufferedWriter bw = new BufferedWriter(out);  
  189.         bw.write(string);  
  190.         bw.flush();  
  191.         bw.close();  
  192.   
  193.     }  
  194.   
  195. }  

 下面就是调用了:

 

Java代码 
  1. package com.hc;  
  2.   
  3. import java.io.File;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. public class Test {  
  9.   
  10.     // // 取JSP页面中所有的中文  
  11.     // public static void main(String[] args) {  
  12.     // // 该文件夹下的所有目标文件  
  13.     // File file = new File("E:/FirstWork/rgsZS/webcontext/");  
  14.     //  
  15.     // // 得到所有目标文件  
  16.     // List<File> fileList = Util.getAllFiles(file);  
  17.     // System.out.println("共有JSP文件:" + fileList.size() + "个");  
  18.     //  
  19.     // // 提取所有文件中的中文  
  20.     // List<String> strList = new ArrayList<String>();  
  21.     // for (File file2 : fileList) {  
  22.     // strList.addAll(Util.getChinese(file2));  
  23.     // }  
  24.     //  
  25.     // // 把提取出来的中文打出来  
  26.     // for (String string : strList) {  
  27.     // System.out.println(string);  
  28.     // }  
  29.     //  
  30.     // }  
  31.   
  32.     // 从excel读出中文和对应的英文,并写入所有的JSP文件  
  33.     public static void main(String[] args) {  
  34.         Map<String, String> map = Util.getMap();  
  35.         System.out.println(map.size());  
  36.         System.out.println(map.keySet());  
  37.   
  38.         // 该文件夹下的所有目标文件  
  39.         File file = new File("E:/FirstWork/rgsZS/webcontext/");  
  40.   
  41.         // 得到所有目标文件  
  42.         List<File> fileList = Util.getAllFiles(file);  
  43.         System.out.println("共有JSP文件:" + fileList.size() + "个");  
  44.   
  45.         // 修改所有文件中的中文  
  46.         for (File file2 : fileList) {  
  47.             Util.editFile(file2, map);  
  48.         }  
  49.   
  50.     }  
  51.   
  52. }