`
lippeng
  • 浏览: 457731 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

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

	}

}
 
0
0
分享到:
评论

相关推荐

    文本批量替换助手 V1.0 绿色免费版

    值得一提的是,文本批量替换助手V1.0 的主文件名为"文本批量替换",用户只需执行这个程序,即可启动文本批量替换助手。绿色版软件的一个显著优势是它不带额外的注册信息或依赖项,这意味着它可以在任何一台安装了...

    【批量下载】MyEclipse_9.0_汉化包等.zip

    MyEclipse是一款强大的集成开发环境(IDE),专为Java、Web和企业级应用程序开发而设计。它是基于Eclipse平台的扩展,提供了更多的功能和服务,包括对Java EE、Spring、Hibernate等框架的良好支持。本资源是...

    jquery Uploadify

    **jQuery Uploadify** 是一个基于jQuery的文件上传插件,它允许用户在Web应用程序中实现异步、批量或单个文件上传功能。该插件以其易用性、自定义性和高性能而受到开发者们的欢迎。在描述中提到,可能有些初学者在...

    去掉代码空白行

    功能: 将文件(.java/.jsp/.html/.htm)中的空白行去掉 使用方法: 将deleteBlank.exe 文件放到要更新的文件夹中,双击即可 1.0.2 修改了空白格只有空格... 1.0.3 修改文件中有汉字时,处理后,汉字部分变为乱码的问题

    使用Idea的一些快捷键

    - **Alt+F7**:查找整个工程中使用地某一个类、方法或者变量的位置。按F3可以选择找到的位置。 - **Ctrl+I**:实现方法。用于实现接口或抽象类中的方法。 - **Ctrl+Shift+U**:大小写转换。快速改变选定文本的大小写...

    搜索工具 Search and Replace

    2. **关键词搜索**:用户只需输入要查找的关键字,工具便会快速扫描指定的文件夹,找出包含该关键字的所有文件和行。这对于定位代码问题、查找特定功能实现或进行代码审查尤其有用。 3. **高级搜索选项**:除了基本...

    MyElipes的所有快捷.txt都在这儿了噢

    根据提供的文件信息,这里将详细解释与"MyElipse的所有快捷方式"相关的知识点,包括但不限于快捷键的功能、使用场景以及在开发中的实际应用。 ### MyEclipse简介 MyEclipse是基于Eclipse平台的一个插件,它为Java...

    网络web+待办事项管理系统

    - **数据库服务器**:MySQL 8.0 是一款开源的关系型数据库管理系统,因其稳定性、速度和可靠性被广泛使用。 ### 知识点三:数据库设计 #### 数据库表设计 - **表结构**:设计了包含 `itemId`、`itemTitle`、`item...

Global site tag (gtag.js) - Google Analytics