Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you escape colon (:) in Properties file?

Tags:

I am using a properties file to store my application's configuration values. In one of the instances, I have to store a value as xxx:yyy:zzz. When I do that, the colon is escaped with a back slash\ resulting in the value showing as xxx\:yyy\:zzz in the properties file.

I am aware that the colon : is a standard delimiter of the Properties Java class. However I still need to save the value without the back slash \.

Any suggestions on how to handle this?

like image 305
indiws Avatar asked May 22 '12 09:05

indiws


People also ask

How do I escape the special characters in properties file?

In my case, two leading '\\' working fine for me.

How do you escape from property file?

would be the two-character key ":=". Line terminator characters can be included using \r and \n escape sequences. Any white space after the key is skipped; if the first non-white space character after the key is '=' or ':' , then it is ignored and any white space characters after it are also skipped.

How remove value from properties file in Java?

Properties properties = new Properties(); properties. load(reader); Then you can use the remove() method.


2 Answers

Put the properties into the Properties object and save it using a store(...) method. The method will perform any escaping required. The Java documentation says:

"... For the key, all space characters are written with a preceding \ character. For the element, leading space characters, but not embedded or trailing space characters, are written with a preceding \ character. The key and element characters #, !, =, and : are written with a preceding backslash to ensure that they are properly loaded."

You only need to manually escape characters if you are creating / writing the file by hand.


Conversely, if you want the file to contain unescaped colon characters, you are out of luck. Such a file is malformed and probably won't load properly using the Properties.load(...) methods. If you go down this route, you'll need to implement your own custom load and/or store methods.

like image 159
Stephen C Avatar answered Sep 24 '22 07:09

Stephen C


I came across the same issue. Forward slashes / also get escaped by the store() method in Properties.

I solved this issue by creating my own CustomProperties class (extending java.util.Properties) and commenting out the call to saveConvert() in the customStore0() method.

Here is my CustomProperties class:

import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.Date; import java.util.Enumeration; import java.util.Properties;  public class CustomProperties extends Properties {   private static final long serialVersionUID = 1L;   @Override   public void store(OutputStream out, String comments) throws IOException {       customStore0(new BufferedWriter(new OutputStreamWriter(out, "8859_1")),                    comments, true);   }   //Override to stop '/' or ':' chars from being replaced by not called    //saveConvert(key, true, escUnicode)   private void customStore0(BufferedWriter bw, String comments, boolean escUnicode)           throws IOException {       bw.write("#" + new Date().toString());       bw.newLine();       synchronized (this) {           for (Enumeration e = keys(); e.hasMoreElements();) {               String key = (String) e.nextElement();               String val = (String) get(key);               // Commented out to stop '/' or ':' chars being replaced               //key = saveConvert(key, true, escUnicode);               //val = saveConvert(val, false, escUnicode);               bw.write(key + "=" + val);               bw.newLine();           }       }       bw.flush();   } } 
like image 29
Patrick Kiernan Avatar answered Sep 22 '22 07:09

Patrick Kiernan