单例模式实现读取配置文件
工作中有个需求是找出文本中出现的QQ号、电话号码等,但是我们知道往往会遇到“玖二⑦零五三二玖、加口2805703、零Ⅲ壹壹872陆7844”,这里我做了一个配置文件,实现这些关键词的过滤,之后需要过滤的时候,读取到Map中,把这些关键词替换成,我们需要的。由于在配置文件中,当然不能用一次读取一次了,正好想起了前两天学习的单例模式。这里选择静态内部类实现单例,保证线程安全的同时实现懒加载。
配置文件
\u96F6=0 \u58F9=1 \u8D30=2 \u53C1=3 \u8086=4 \u4F0D=5 \u9646=6 \u67D2=7 \u634C=8 \u7396=9 \u4E00=1 \u4E8C=2 \u4E09=3 \u56DB=4 \u4E94=5 \u516D=6 \u4E03=7 \u516B=8 \u4E5D=9 \u2460=1 \u2461=2 \u2462=3 \u2463=4 \u2464=5 \u2465=6 \u2466=7 \u2467=8 \u2468=9 \u3007=0 \u2160=1 \u2161=2 \u2162=3 \u2163=4 \u2164=5 \u2165=6 \u2166=7 \u2167=8 \u2168=9 \u6263\u6263=qq \u6263q=qq \u53E3\u53E3=qq \u53E3=q
静态内部类实现单例模式,读取配置文件中的内容到Map中
import java.io.InputStream; import java.util.Enumeration; import java.util.Map; import java.util.Properties; import com.google.common.collect.Maps; /** * * <p> * PropertiesUtil 静态内部类实现单例模式读取配置文件 * 静态内部类既能保证线程安全也能保证懒加载 * <p> * * @author <a href="mailto:yangkj@corp.21cn.com">yangkj</a> * @version * @since 2016年8月29日 */ public class PropertiesUtil { private static Map<String, String> proMap = Maps.newHashMap(); private static class PropertiesInstance { private static final PropertiesUtil props = new PropertiesUtil(); } public static PropertiesUtil getInstance() { return PropertiesInstance.props; } public Map<String, String> getPropMap() { return proMap; } private PropertiesUtil() { proMap = readProperties(); } /** * 去读properties文件的内容,保存到Map中 * * @param propsName * @return */ @SuppressWarnings({ "rawtypes" }) private static Map<String, String> readProperties() { Properties props = new Properties(); try { InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream("TipWordChange.properties"); props.load(in); Enumeration en = props.propertyNames(); while (en.hasMoreElements()) { String key = (String) en.nextElement(); String value = props.getProperty(key); proMap.put(key, value); } } catch (Exception e) { e.printStackTrace(); } return proMap; } }
测试类:
public static void main(String[] args) { PropertiesUtil props01 = PropertiesUtil.getInstance(); PropertiesUtil props02 = PropertiesUtil.getInstance(); System.out.println(props01 == props02); String testString = "零Ⅲ壹壹872陆7844"; for (String key : props01.getPropMap().keySet()) { if (testString.contains(key)) { testString = testString.replace(key, props01.getPropMap().get(key)); } } System.out.println(testString); }
测试结果: