2014-07-23 27 views
0

這是我原來的postgresql.conf \ t字符:java.util.Properties增加了對.store()

# 
#Wed Jul 23 16:13:09 IST 2014 
lc_monetary='English_India.1252' # locale for monetary formatting 
listen_addresses='*'  # what IP address(es) to listen on; 
max_connections=100  # (change requires restart) 
port=5433 
shared_buffers=128MB  # min 128kB 
log_timezone='Asia/Calcutta' 
timezone='Asia/Calcutta' 
datestyle='iso, dmy' 
lc_numeric='English_India.1252'  # locale for number formatting 
lc_time='English_India.1252'  # locale for time formatting 
default_text_search_config='pg_catalog.english' 
lc_messages='English_India.1252'  # locale for system error message 



我在運行時從Java中使用下面的代碼更新postgresql.conf中:

Properties input = new java.util.Properties(); 
InputStream reader=new 
FileInputStream(System.getProperty("user.dir")+"/postgresql.conf"); 
input.load(reader); 
input.setProperty("port", String.valueOf(Installer.newport)); 
OutputStream confFile=new FileOutputStream(System.getProperty("user.dir")+"\\postgresql.conf"); 
input.store(confFile, ""); 
confFile.close(); 


該代碼產生以下的postgresql.conf:

# 
#Wed Jul 23 16:13:09 IST 2014 
lc_monetary='English_India.1252'\t\t\t\# locale for monetary formatting 
listen_addresses='*'\t\t\# what IP address(es) to listen on; 
max_connections=100\t\t\t\# (change requires restart) 
port=5433 
shared_buffers=128MB\t\t\t\# min 128kB 
log_timezone='Asia/Calcutta' 
timezone='Asia/Calcutta' 
datestyle='iso, dmy' 
lc_numeric='English_India.1252'\t\t\t\# locale for number formatting 
lc_time='English_India.1252'\t\t\t\t\# locale for time formatting 
default_text_search_config='pg_catalog.english' 
lc_messages='English_India.1252'\t\t\t\# locale for system error message 


不知怎的,'\ t'字符正在被添加或被看作是轉義序列。

Reader reader = new InputStreamReader(new FileInputStream(System.getProperty("user.dir")+"/postgresql.conf"),"UTF-8"); 



OutputStreamWriter confFile=new OutputStreamWriter(new FileOutputStream(System.getProperty("user.dir")+"\\postgresql.conf"),"UTF-8"); 


怎麼回事錯在這裏:

我也用指定的編碼試過嗎?

+0

_postgresql.conf_替換不是Java屬性文件。只有行[以#開頭(http://docs.oracle.com/javase/8/docs/api/java/util/Properties.html#load-java.io.Reader-)被視爲Java屬性中的註釋文件。 – McDowell

+0

那麼?如何讀取/寫入.conf文件? 我使用了Properties,因爲它包含key = value格式。 參考: http://stackoverflow.com/questions/16273174/how-to-read-a-configuration-file-in-java –

回答

2

沒有任何問題。如果你能在java.util.Poperties源代碼中看到的所有選項卡與\t

private String saveConvert(String theString, 
           boolean escapeSpace, 
           boolean escapeUnicode) { 
     int len = theString.length(); 
     int bufLen = len * 2; 
     if (bufLen < 0) { 
      bufLen = Integer.MAX_VALUE; 
     } 
     StringBuffer outBuffer = new StringBuffer(bufLen); 

     for(int x=0; x<len; x++) { 
      char aChar = theString.charAt(x); 
      // Handle common case first, selecting largest block that 
      // avoids the specials below 
      if ((aChar > 61) && (aChar < 127)) { 
       if (aChar == '\\') { 
        outBuffer.append('\\'); outBuffer.append('\\'); 
        continue; 
       } 
       outBuffer.append(aChar); 
       continue; 
      } 
      switch(aChar) { 
       case ' ': 
        if (x == 0 || escapeSpace) 
         outBuffer.append('\\'); 
        outBuffer.append(' '); 
        break; 
       case '\t':outBuffer.append('\\'); outBuffer.append('t'); 
          break; 
       case '\n':outBuffer.append('\\'); outBuffer.append('n'); 
          break; 
       case '\r':outBuffer.append('\\'); outBuffer.append('r'); 
          break; 
       case '\f':outBuffer.append('\\'); outBuffer.append('f'); 
          break; 
       case '=': // Fall through 
       case ':': // Fall through 
       case '#': // Fall through 
       case '!': 
        outBuffer.append('\\'); outBuffer.append(aChar); 
        break; 
       default: 
        if (((aChar < 0x0020) || (aChar > 0x007e)) & escapeUnicode) { 
         outBuffer.append('\\'); 
         outBuffer.append('u'); 
         outBuffer.append(toHex((aChar >> 12) & 0xF)); 
         outBuffer.append(toHex((aChar >> 8) & 0xF)); 
         outBuffer.append(toHex((aChar >> 4) & 0xF)); 
         outBuffer.append(toHex(aChar  & 0xF)); 
        } else { 
         outBuffer.append(aChar); 
        } 
      } 
     } 
     return outBuffer.toString(); 
    } 
+0

感謝您指出。現在我擴展了Properties類並更改了正在寫入'\ t'的部分。你能提出更好的解決方案嗎? –

+0

嘗試將選項卡更改爲空白我認爲這是一個更好的解決方案。 – Jens

+0

我做到了,但仍然添加了'\'。我已經成功地將代碼更改爲我的要求,只是等待更好的修復。 –