package org.nutz.lang.util; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.nutz.lang.Strings; /** * 可支持直接书写多行文本的 Properties 文件 * * @author zozoh(zozohtnt@gmail.com) */ public class MultiLineProperties implements Map<String, String> { public MultiLineProperties(Reader reader) throws IOException { this(); load(reader); } public MultiLineProperties() { maps = new HashMap<String, String>(); } protected Map<String, String> maps; /** * <b>载入并销毁之前的记录</b> * * @param reader * @throws IOException */ public synchronized void load(Reader reader) throws IOException { load(reader, false); } public synchronized void load(Reader reader, boolean clear) throws IOException { if (clear) this.clear(); BufferedReader tr = null; if (reader instanceof BufferedReader) tr = (BufferedReader) reader; else tr = new BufferedReader(reader); String s; while (null != (s = tr.readLine())) { if (Strings.isBlank(s)) continue; if (s.length() > 0 && s.trim().charAt(0) == '#') // 只要第一个非空白字符是#,就认为是注释 continue; int pos; char c = '0'; for (pos = 0; pos < s.length(); pos++) { c = s.charAt(pos); if (c == '=' || c == ':') break; } if (c == '=') { String name = s.substring(0, pos); maps.put(Strings.trim(name), s.substring(pos + 1)); } else if (c == ':') { String name = s.substring(0, pos); StringBuffer sb = new StringBuffer(); sb.append(s.substring(pos + 1)); String ss; while (null != (ss = tr.readLine())) { if (ss.length() > 0 && ss.charAt(0) == '#') break; sb.append("\r\n" + ss); } maps.put(Strings.trim(name), sb.toString()); if (null == ss) return; } else { maps.put(Strings.trim(s), null); } } } public synchronized void clear() { maps.clear(); } public boolean containsKey(Object key) { return maps.containsKey(key); } public boolean containsValue(Object value) { return maps.containsValue(value); } public Set<Entry<String, String>> entrySet() { return maps.entrySet(); } @Override public boolean equals(Object o) { return maps.equals(o); } @Override public int hashCode() { return maps.hashCode(); } public boolean isEmpty() { return maps.isEmpty(); } public Set<String> keySet() { return maps.keySet(); } public List<String> keys() { return new ArrayList<String>(maps.keySet()); } public synchronized String put(String key, String value) { return maps.put(key, value); } @SuppressWarnings({"unchecked", "rawtypes"}) public synchronized void putAll(Map t) { maps.putAll(t); } public synchronized String remove(Object key) { return maps.remove(key); } public int size() { return maps.size(); } public Collection<String> values() { return maps.values(); } public String get(Object key) { return maps.get(key); } }