config.java

来自「一款Java实现的HTTP代理服务器」· Java 代码 · 共 279 行

JAVA
279
字号
package rabbit.util;// $Id: Config.java,v 1.7 2005/08/03 17:00:55 robo Exp $import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.io.Reader;import java.util.Collection;import java.util.HashMap;import java.util.Map;import java.util.StringTokenizer;/** a class to handle configs for different things. *  reads file on the format <pre> *  [sectionName1] *  key=value *  key2=value2 *  [sectionName2] *  key=value *  key2=value2  *  key_with_equals\=still_key=value3 *  </pre> *  everything after the first '#' is considered a comment. *  blank lines are ignored. If you want keys with '=' in them  *  escape it to '\=' and you should be fine. */public class Config {    private Map<String, SProperties> configs;    /** create an empty Config (has only section "" with no data in it)     */    public Config () {	configs = new HashMap<String, SProperties> ();	SProperties current = new SProperties (); // the main thing.	configs.put ("", current);     }    /** Create a Config for the specified file     * @param filename the File we read the config from     */    public Config (String filename) throws IOException {	BufferedReader br = new BufferedReader (new FileReader (filename));	readConfig (br);    }    /** Create a Config for the specified file     * @param file the File we read the config from     */    public Config (File file) throws IOException {	BufferedReader br = new BufferedReader (new FileReader (file));	readConfig (br);    }        /** Create a Config by reading it from a stream.     * @param is the stream to read the config from.     */    public Config (InputStream is) throws IOException {	BufferedReader br = new BufferedReader (new InputStreamReader (is));	readConfig (br);    }    /** Create a Config by reading it from a reader.     * @param reader the Reader to read the config from.     */    public Config (Reader reader) throws IOException {	BufferedReader br = new BufferedReader (reader);	readConfig (br);    }        /** read in a Config from a reader.     * @param br the reader that has the Config.     */    private void readConfig (BufferedReader br) throws IOException {	String line;	configs = new HashMap<String, SProperties> ();	SProperties current = new SProperties (); // the main thing.	configs.put ("", current); 	while ((line = br.readLine ()) != null) {	    int index = line.indexOf ('#');	    if (index >= 0) 		line = line.substring (0,index);	    if (line.equals (""))		continue;	    if (line.startsWith ("[")) {		int endindex = line.indexOf (']');		if (endindex >= 0) {		    String newSection = line.substring (1,endindex);		    // collapse configs named equal.		    if (configs.get (newSection) != null)			current = configs.get (newSection);		    else 			current = new SProperties ();		    configs.put (newSection, current);	  		}	    }	    else {		boolean escaped = false;		int start = 0;		int eqindex;		do {		    escaped = false;		    eqindex = line.indexOf ('=', start);		    if (eqindex > 0) {			if (line.charAt (eqindex-1) == '\\') {			    escaped = true;			    start = eqindex;			    line = line.substring (0,eqindex-1) + line.substring (eqindex);			}		    }		} while (escaped);		String key = "" , value = "";		if (eqindex >= 0) {		    key = line.substring (0,eqindex);		    value = line.substring (eqindex+1);		} else 		    key = line;		current.put (key, value);	    }	}	br.close ();    }    /** get the available sections     * @return an Enumeration of the available sections (including the empty section).     */    public Collection<String> getSections () {	return configs.keySet ();    }    /** get the properties for a given section     * @param sectionName the section we want properties for.     * @return a SProperties if section exist or null.     */    public SProperties getProperties (String sectionName) {	return configs.get (sectionName);    }        /** set the properties for a given section     * @param sectionName the section we want to set the properties for.     * @param prop the SProperties for the sections     */    public void setProperties (String sectionName, SProperties prop) {	configs.put (sectionName, prop);    }    /** get a property for given key in specified section     * @param section the section we should look in.     * @param key the key we want a value for.     * @return a string if section + key is set, null otherwise     */    public String getProperty (String section, String key) {	return getProperty (section, key, null);    }    /** get a property for given key in specified section     * @param section the section we should look in.     * @param key the key we want a value for.     * @param defaultstring the string to use if no value is found.     * @return a string if section + key is set, null otherwise     */    public String getProperty (String section, String key, String defaultstring) {	SProperties p = getProperties (section);	if (p != null) {	    String s = p.get (key);	    if (s != null)		return s;	}	return defaultstring;    }    /** set a property for given section.     * @param section the section we should look in.     * @param key the key.     * @param value the value.     */    public void setProperty (String section, String key, String value) {	SProperties p = getProperties (section);	if (p == null) {	    p = new SProperties ();	    configs.put (section, p);	}	p.put (key, value);    }        /** save the config to a OutputStream      */    public void save (OutputStream os) {	save (os, null);    }    /** save the config to a OutputStream      */    public void save (OutputStream os, String comment) {	PrintWriter dos = new PrintWriter (os);	if (comment != null) {	    StringTokenizer st = new StringTokenizer (comment, "\n");	    while (st.hasMoreElements ()) {		String str = st.nextToken ();		dos.println ("#" + str);	    }	}	for (String section : configs.keySet ()) {	    dos.println ("[" + section + "]");	    SProperties pr = configs.get (section);	    for (Map.Entry<String, String> me : pr.entrySet ()) {		String key = me.getKey ();		String value = me.getValue ();		if (value == null)		    value = "";		StringTokenizer st = new StringTokenizer (key, "=", true);		while (st.hasMoreTokens ()) {		    String token = st.nextToken ();		    if (token.equals ("="))			dos.print ('\\');		    dos.print (token);		}		dos.println ("=" + value);	    }	    dos.println ("");	}	dos.flush ();    }    /** Get a string describing this Config     */    public String toString () {	StringBuilder res = new StringBuilder ();	for (String section : configs.keySet ()) {	    res.append ('[');	    res.append (section);	    res.append (']');	    res.append ('\n');	    SProperties pr = configs.get (section);	    for (Map.Entry<String, String> me : pr.entrySet ()) {		String key = me.getKey ();		String value = me.getValue ();		if (value == null)		    value = "";		StringTokenizer st = new StringTokenizer (key, "=", true);		while (st.hasMoreTokens ()) {		    String token = st.nextToken ();		    if (token.equals ("="))			res.append ('\\');		    res.append (token);		}		res.append ('=');		res.append (value);		res.append ('\n');	    }	    res.append ('\n');	}	return res.toString ();    }    /** Merge this config with another one.     *  that for every section/key in either of the two configs do:     *  if this Config has the value use it otherwise use others value.     * @param other the Config to merge with.     */    public void merge (Config other) {	for (String section : other.getSections ()) {	    SProperties p = other.getProperties (section);	    if (p == null)		continue;	    for (Map.Entry<String, String> me : p.entrySet ()) {		String key = me.getKey ();		String value = me.getValue ();		String merged = getProperty (section, key, value);		setProperty (section, key, merged);	    }	}    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?