Java tutorial
/* Copyright c 2005-2012. * Licensed under GNU LESSER General Public License, Version 3. * http://www.gnu.org/licenses */ package org.beangle.commons.text.replacer; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.OutputStreamWriter; import java.util.List; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.beangle.commons.collection.CollectUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Batch replace file with pattern. Using<B> BatchReplaceMain dir patternfile * [encoding]</B> * <p> * Pattern file like this. * * <pre> * ftl * <#(.*?)>=[#$1] * </#(.*?)>=[/#$1] * </@>=[/@] * <@(.*?)/>=[@$1/] * <@(.*?)>=[@$1] * </@(.*?)>=[/@] * </pre> * * @author chaostone */ public class BatchReplaceMain { private static Logger logger = LoggerFactory.getLogger(BatchReplaceMain.class); public static void main(String[] args) throws Exception { if (args.length < 2) { logger.info("using BatchReplaceMain dir patternfile encoding"); return; } String dir = args[0]; if (!new File(dir).exists()) { logger.error("{} not a valid file or directory", dir); return; } String properties = args[1]; if (!new File(properties).exists()) { logger.info("{} not valid file or directory", properties); } String encoding = null; if (args.length >= 3) { encoding = args[2]; } List<String> lines = FileUtils.readLines(new File(properties)); Map<String, List<Replacer>> profiles = CollectUtils.newHashMap(); List<Replacer> replacers = null; for (String line : lines) { if (StringUtils.isEmpty(line)) { continue; } if (-1 == line.indexOf('=')) { replacers = CollectUtils.newArrayList(); profiles.put(line, replacers); } else { line = StringUtils.replace(line, "\\=", "~~~~"); String older = StringUtils.replace(StringUtils.substringBefore(line, "="), "~~~~", "="); String newer = StringUtils.replace(StringUtils.substringAfter(line, "="), "~~~~", "="); older = StringUtils.replace(older, "\\n", "\n"); older = StringUtils.replace(older, "\\t", "\t"); newer = StringUtils.replace(newer, "\\n", "\n"); newer = StringUtils.replace(newer, "\\t", "\t"); Replacer pair = new Replacer(older, newer); replacers.add(pair); } } replaceFile(dir, profiles, encoding); } public static void replaceFile(String fileName, final Map<String, List<Replacer>> profiles, String encoding) throws Exception, FileNotFoundException { File file = new File(fileName); if (file.isFile() && !file.isHidden()) { List<Replacer> replacers = profiles.get(StringUtils.substringAfterLast(fileName, ".")); if (null == replacers) { return; } logger.info("processing {}", fileName); String filecontent = FileUtils.readFileToString(file, encoding); filecontent = Replacer.process(filecontent, replacers); writeToFile(filecontent, fileName, encoding); } else { String[] subFiles = file.list(new FilenameFilter() { public boolean accept(File dir, String name) { if (dir.isDirectory()) return true; boolean matched = false; for (String key : profiles.keySet()) { matched = name.endsWith(key); if (matched) return true; } return false; } }); if (null != subFiles) { for (int i = 0; i < subFiles.length; i++) { replaceFile(fileName + '/' + subFiles[i], profiles, encoding); } } } } public static void writeToFile(String str, String fileName, String encoding) throws Exception { OutputStreamWriter writer = null; if (null == encoding) { writer = new OutputStreamWriter(new FileOutputStream(fileName)); } else { writer = new OutputStreamWriter(new FileOutputStream(fileName), encoding); } writer.write(str); writer.close(); } }