-->

Properties file backslash and semicolon

2019-01-26 19:39发布

问题:

I have a java class to write/append into existing properties file. After appending, its replacing all single backslash with double backslash and it places single backslash before every semicolon.

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  response.setContentType("text/html");
  PrintWriter out= response.getWriter();
  String systemPath=request.getParameter("SYSTEMPATH");
  String deployPath = getServletConfig().getServletContext().getRealPath("/WEB-INF/DB.properties");
  InputStream stream = getServletContext().getResourceAsStream("/WEB-INF/DB.properties");
  Properties prop = new Properties();
  prop.load(stream);
  prop.setProperty("Workspace", systemPath);
  File file = new File(deployPath);
  FileOutputStream fileOut = new FileOutputStream(file);
  prop.store(fileOut, "sample properties");
  fileOut.close();
}

Before appending:

Url=jdbc:oracle:thin:@//192.168.1.22:1521/

Workspace=D:\RACHEL\SW\Antivirus

after appending:

Url=jdbc\:oracle\:thin\:@//192.168.1.22\:1521/

Workspace=D\:\\RACHEL\\SW\\Antivirus

How to remove these extra backslashes?

回答1:

The properties file should have the extra backslashes to start with. In particular, without them you could end up with the wrong data, e.g. if you have d:\foo\new that wouldn't mean what you expect it to.

The backslashes escape characters which are sensitive in properties files, basically. The colons are unnecessary (as they're not in the key) but they don't do any harm either. The doubling of backslashes for text is entirely beneficial.

This is documented in the Properties documentation - in particular, look at the store() method that you're calling.



回答2:

Properties file has their own format. Colon and backslashes are special characters in properties file. So, they have to be escaped. Also take a look at Properties.load() documentation.

If you are using Properties class to write and read the file, there won't be any problem. But, if you write the properties file using Property class, and read using some other method, then you would have to handle the escapes manually.



回答3:

you can retrieve the key and its value and check and it will not vary but in properties file It seems to look with extra slashes



回答4:

I had this same problem, as I was on stackoverflow on another issue. I remember had this code! I hope it helps, at least it is java, but it does escaping an issue in Properties file backslash and semicolon pitfall.

  // load to store prop
  @SuppressWarnings ( "resource" )
  PrintWriter pw = new PrintWriter( configFile );
  pw.println( "#" + LocalDateTime.now() );
  pw.println( "hibernate.connection.username=" +  prop.getProperty( "hibernate.connection.username" ) );
  pw.println( "hibernate.connection.password=" + prop.getProperty( "hibernate.connection.password" ) );
  pw.println( "hibernate.connection.url=" + prop.getProperty( "hibernate.connection.url" ) );
  pw.close();