import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; import java.util.Properties; import java.util.logging.Logger; /** * Used for accessing and creating .[properties] files, reads them as utf-8, * saves as utf-8. Internationalization is key importance especially for * character codes. * * @author Nijikokun * @version 1.0.4, %G% */ public final class PropertiesFile { private static final Logger log = Logger.getLogger("Minecraft"); private String fileName; private Properties props = new Properties(); // private List<String> lines = new ArrayList<String>(); // private Map<String, String> props = new HashMap<String, String>(); /** * Creates or opens a properties file using specified filename * * @param fileName */ public PropertiesFile(String fileName) { this.fileName = fileName; File file = new File(fileName); try { if (file.exists()) load(); else save(); } catch (IOException ex) { log.severe("[PropertiesFile] Unable to load " + fileName + "!"); } } /** * The loader for property files, it reads the file as UTF8 or converts the * string into UTF8. Used for simple runthrough's, loading, or reloading of * the file. * * @throws IOException */ public void load() throws IOException { FileInputStream stream = null; try { stream = new FileInputStream(fileName); props.load(stream); } catch (IOException ex) { } finally { try { if (stream != null) stream.close(); } catch (IOException ex) { } } } /** * Writes out the <code>key=value</code> properties that were changed into a * .[properties] file in UTF8. */ public void save() { FileOutputStream stream = null; try { stream = new FileOutputStream(fileName); props.store(stream, null); } catch (IOException ex) { } finally { try { if (stream != null) stream.close(); } catch (IOException ex) { } } } /** * Returns a Map of all <code>key=value</code> properties in the file as * <code><key (java.lang.String), value (java.lang.String)></code> <br /> * <br /> * Example: <blockquote> * * <pre> * PropertiesFile settings = new PropertiesFile("settings.properties"); * Map<String, String> mappedSettings; * * try { * mappedSettings = settings.returnMap(); * } catch (Exception ex) { * log.info("Failed mapping settings.properties"); * } * </pre> * * </blockquote> * * @return <code>map</code> - Simple Map HashMap of the entire * <code>key=value</code> as * <code><key (java.lang.String), value (java.lang.String)></code> * @throws Exception * If the properties file doesn't exist. */ public Map<String, String> returnMap() throws Exception { return (Map<String, String>) props.clone(); } /** * Checks to see if the .[properties] file contains the given * <code>key</code>. * * @param var * The key we are going to be checking the existance of. * @return <code>Boolean</code> - True if the <code>key</code> exists, false * if it cannot be found. */ public boolean containsKey(String var) { return props.containsKey(var); } /** * Checks to see if this <code>key</code> exists in the .[properties] file. * * @param var * The key we are grabbing the value of. * @return <code>java.lang.String</code> - True if the <code>key</code> * exists, false if it cannot be found. */ public String getProperty(String var) { return props.getProperty(var); } /** * Remove a key from the file if it exists. This will save() which will * invoke a load() on the file. * * @see #save() * @param var * The <code>key</code> that will be removed from the file */ public void removeKey(String var) { if (props.containsKey(var)) { props.remove(var); save(); } } /** * Checks the existance of a <code>key</code>. * * @see #containsKey(java.lang.String) * @param key * The <code>key</code> in question of existance. * @return <code>Boolean</code> - True for existance, false for * <code>key</code> found. */ public boolean keyExists(String key) { return containsKey(key); } /** * Returns the value of the <code>key</code> given as a <code>String</code>, * however we do not set a string if no <code>key</code> is found. * * @see #getProperty(java.lang.String) * @param key * The <code>key</code> we will retrieve the property from, if no * <code>key</code> is found default to "" or empty. */ public String getString(String key) { if (containsKey(key)) return getProperty(key); return ""; } /** * Returns the value of the <code>key</code> given as a <code>String</code>. * If it is not found, it will invoke saving the default <code>value</code> * to the properties file. * * @see #setString(java.lang.String, java.lang.String) * @see #getProperty(java.lang.String) * @param key * The key that we will be grabbing the value from, if no value * is found set and return <code>value</code> * @param value * The default value that we will be setting if no prior * <code>key</code> is found. * @return java.lang.String Either we will return the default value or a * prior existing value depending on existance. */ public String getString(String key, String value) { if (containsKey(key)) return getProperty(key); setString(key, value); return value; } /** * Save the value given as a <code>String</code> on the specified key. * * @see #save() * @param key * The <code>key</code> that we will be addressing the * <code>value</code> to. * @param value * The <code>value</code> we will be setting inside the * <code>.[properties]</code> file. */ public void setString(String key, String value) { props.put(key, value); save(); } /** * Returns the value of the <code>key</code> given in a Integer, however we * do not set a string if no <code>key</code> is found. * * @see #getProperty(String var) * @param key * The <code>key</code> we will retrieve the property from, if no * <code>key</code> is found default to 0 */ public int getInt(String key) { if (containsKey(key)) return Integer.parseInt(getProperty(key)); return 0; } /** * Returns the int value of a key * * @see #setInt(String key, int value) * @param key * The key that we will be grabbing the value from, if no value * is found set and return <code>value</code> * @param value * The default value that we will be setting if no prior * <code>key</code> is found. * @return <code>Integer</code> - Either we will return the default value or * a prior existing value depending on existance. */ public int getInt(String key, int value) { if (containsKey(key)) return Integer.parseInt(getProperty(key)); setInt(key, value); return value; } /** * Save the value given as a <code>int</code> on the specified key. * * @see #save() * @param key * The <code>key</code> that we will be addressing the * <code>value</code> to. * @param value * The <code>value</code> we will be setting inside the * <code>.[properties]</code> file. */ public void setInt(String key, int value) { props.put(key, String.valueOf(value)); save(); } /** * Returns the value of the <code>key</code> given in a Double, however we * do not set a string if no <code>key</code> is found. * * @see #getProperty(String var) * @param key * The <code>key</code> we will retrieve the property from, if no * <code>key</code> is found default to 0.0 */ public double getDouble(String key) { if (containsKey(key)) return Double.parseDouble(getProperty(key)); return 0; } /** * Returns the double value of a key * * @see #setDouble(String key, double value) * @param key * The key that we will be grabbing the value from, if no value * is found set and return <code>value</code> * @param value * The default value that we will be setting if no prior * <code>key</code> is found. * @return <code>Double</code> - Either we will return the default value or * a prior existing value depending on existance. */ public double getDouble(String key, double value) { if (containsKey(key)) return Double.parseDouble(getProperty(key)); setDouble(key, value); return value; } /** * Save the value given as a <code>double</code> on the specified key. * * @see #save() * @param key * The <code>key</code> that we will be addressing the * <code>value</code> to. * @param value * The <code>value</code> we will be setting inside the * <code>.[properties]</code> file. */ public void setDouble(String key, double value) { props.put(key, String.valueOf(value)); save(); } /** * Returns the value of the <code>key</code> given in a Long, however we do * not set a string if no <code>key</code> is found. * * @see #getProperty(String var) * @param key * The <code>key</code> we will retrieve the property from, if no * <code>key</code> is found default to 0L */ public long getLong(String key) { if (containsKey(key)) return Long.parseLong(getProperty(key)); return 0; } /** * Returns the long value of a key * * @see #setLong(String key, long value) * @param key * The key that we will be grabbing the value from, if no value * is found set and return <code>value</code> * @param value * The default value that we will be setting if no prior * <code>key</code> is found. * @return <code>Long</code> - Either we will return the default value or a * prior existing value depending on existance. */ public long getLong(String key, long value) { if (containsKey(key)) return Long.parseLong(getProperty(key)); setLong(key, value); return value; } /** * Save the value given as a <code>long</code> on the specified key. * * @see #save() * @param key * The <code>key</code> that we will be addressing the * <code>value</code> to. * @param value * The <code>value</code> we will be setting inside the * <code>.[properties]</code> file. */ public void setLong(String key, long value) { props.put(key, String.valueOf(value)); save(); } /** * Returns the value of the <code>key</code> given in a Boolean, however we * do not set a string if no <code>key</code> is found. * * @see #getProperty(String var) * @param key * The <code>key</code> we will retrieve the property from, if no * <code>key</code> is found default to false */ public boolean getBoolean(String key) { if (containsKey(key)) return Boolean.parseBoolean(getProperty(key)); return false; } /** * Returns the boolean value of a key * * @see #setBoolean(String key, boolean value) * @param key * The key that we will be grabbing the value from, if no value * is found set and return <code>value</code> * @param value * The default value that we will be setting if no prior * <code>key</code> is found. * @return <code>Boolean</code> - Either we will return the default value or * a prior existing value depending on existance. */ public boolean getBoolean(String key, boolean value) { if (containsKey(key)) return Boolean.parseBoolean(getProperty(key)); setBoolean(key, value); return value; } /** * Save the value given as a <code>boolean</code> on the specified key. * * @see #save() * @param key * The <code>key</code> that we will be addressing the * <code>value</code> to. * @param value * The <code>value</code> we will be setting inside the * <code>.[properties]</code> file. */ public void setBoolean(String key, boolean value) { props.put(key, String.valueOf(value)); save(); } }