2013-04-03 49 views
3

我使用java的屬性類來保存我的應用程序的一些配置。這是我第一次使用性能,所以請溫柔與我:)如何在java中親自格式化屬性文件?

我可以插入和檢索性能,沒有問題的數據,但我想插入的數據是這樣的:

屬性文件:

#Header generated by java ~ this is fine, I don't care 

#Server 1 configuration 
url=192.168.1.1 
port=6546 
username=max 
password=123 

#Server 2 configuration 
url=192.168.2.1 
port=6454 
username:dude 
password:123 

#And so on... 

這是我的代碼:

public void setProp(String host, String port, String user, String pass, 
          String host2, String port2, String user2, String pass2) 
{ 
     try{ 
      prop.setProperty("host", host); 
      prop.setProperty("port", porto); 
      prop.setProperty("username", user); 
      prop.setProperty("password", pass); 

      prop.setProperty("host2", host2); 
      prop.setProperty("port2", porto2); 
      prop.setProperty("username2", user2); 
      prop.setProperty("password2", pass2); 

      config.store(new FileOutputStream("configuration.properties"), "Server 1 Configuration"); 

     }catch (Exception e) { 
      JOptionPane.showMessageDialog(null,"Error: "+e.getMessage()); 
     } 
} 

編輯: @Nathan不敢靠近我假裝。文件生成的屬性是:

#Wed Apr 03 14:03:57 BST 2013 
server1.url=192.168.1.1 
server1.port=80 
server2.password=qqq 
server1.user=root 
server2.port=88 
server2.user=dude 
server1.pass=123 
server2.url=192.168.2.1 

我要尋找的東西,如:

#Wed Apr 03 14:03:57 BST 2013 
#Server 1 details 
server1.url=192.168.1.1 
server1.port=80 
server1.user=root 
server1.pass=123 

#Server 2 details: 
server2.password=qqq 
server2.port=88 
server2.user=dude 
server2.url=192.168.2.1 

我甚至不關心,如果訂單是不正確(如上面URL,並在端口密碼等),我只需要按照他們現在的例子分組。

+7

這是什麼問題? –

+0

我想你想在同一個屬性文件中擁有兩臺服務器的屬性。我對嗎? –

+0

是的@sonic,你是對的。這是一個問題,如何使之成爲可能。 – dazito

回答

3

我想我看到你的問題......當你有:

#Server 1 configuration 
url=192.168.1.1 
port=6546 

#Server 2 configuration 
url=192.168.2.1 
port=6454 

僅適用於網址,端口等的最後一個值...將在屬性中讀取文件,因爲每個隨後的一個會覆蓋以前。我通常是通過做這樣的事情得到了解決此問題:

#Server 1 configuration 
server.1.url=192.168.1.1 
server.1.port=6546 

#Server 2 configuration 
server.2.url=192.168.2.1 
server.2.port=6454 

.... 

#Server n configuration 
server.n.url=192.168.2.1 
server.n.port=6454 

您還可以存儲服務器的總數,與像一個屬性:

number.of.servers=55 

但是,這是假設服務器號碼是連續的。在更普遍的情況下,讓我們假設他們不這樣你就可以有這樣的:

#server 1 
url=xxx 
port=123 

#server 100 
url=xxx 
port=123 

#server 5 
url=xxx 
port=123 

由於@Nathan休斯簡明指出屬性是鍵值對,每個重複鍵將吹走之前的關鍵。我沒有使用YAML,但我更喜歡JSON而不是XML。但是你仍然可以堅持屬性。

正如前面所指出的,你可以做這樣的事情:

#server 1 
server.1.url=xxx 
server.1.port=123 

#server 100 
server.100.url=xxx 
server.100.port=123 

#server 5 
server.5.url=xxx 
server.5.port=123 

所以,現在的問題是,該服務器數量都在我的屬性文件。只需遍歷屬性文件的鍵,並做一些字符串功夫。

Properties p = myReadProperties(); 
Set<String> keys = p.keySet(); 
Set<Integer> serverNumbers = new Set<Integer>(); 
Iterator<String> i = keys.iterator(); 
String str, strArray; 
while(i.hasNext()) { 
    str = i.next(); 
    //A regex would be better here, but for brevity. 
    if(str.startsWith("server.") && str.endsWith(".url")) { 
    strArray = str.split("."); 
    serverNumbers.add(new Integer(strArray[1])); 
    } 

所以現在你有一組服務器號碼。您可以重建您的屬性鍵以獲得任何價值。

+1

+1結尾的句子的問題,也希望能夠看到關於「巧妙的字符串匹配」的更多詳細信息(我會自己添加,但尚未完成() – ametren

+0

對不起,明天再來看看,好嗎? –

5

屬性文件並非如此分層。 (還有其他格式,如YAML或XML,但不是這一種)。相反,每一行都是一個鍵值對,其中鍵必須在文件中唯一。 (Properties類是從Hashtable中快速入侵的。)更改屬性鍵文件:

#Server 1 Configuration 
server1.url=192.168.1.1 
server1.port=6546 
server1.username=max 
server1.password=123 

#Server 2 configuration 
server2.url=192.168.2.1 
server2.port=6454 
server2.username:dude 
server2.password:123 

然後更改您的代碼是這樣的:

 prop.setProperty("server1.url", host); 

因爲屬性擴展哈希表和哈希表給你他們的鍵值對自己內部的順序,當你從一個Properties對象生成一個屬性文件時,這些條目將會全部混亂起來。既然你想要按任意順序排序,排序也不是一件容易的事情。我將使用代碼生成屬性文件的初始版本,然後移動所需內容,然後使用該屬性文件。如果您需要以編程方式生成屬性文件,那麼您將需要編寫代碼以寫入文件,而不是使用屬性。

+0

@ user2240409你不能生成屬性文件,看起來像這樣嗎? – maba

+0

我修改了我原來的問題@NathanHughes – dazito

1
#Server 1 configuration 
url=192.168.1.1 
port=6546 
username=max 
password=123 

#Server 2 configuration 
url=192.168.2.1 
port=6454 
username:dude 
password:123 

所以,如果我明白了,你想創建一個這樣的配置文件。你可以做什麼來格式化它,一旦保存,打開文件並插入你想要的行,這將是一件非常痛苦的工作。如果你想要一個結構良好的配置文件,那你爲什麼不嘗試使用xml和jaxb?

喜歡的東西:

<servers> 
<server> 
<id>1</id> 
<url>192.168.1.1</url> 
<port>6546</port> 
<username>max</username> 
<password>123</password> 
</server> 

<server> 
<id>2</id> 
<url>192.168.2.1</url> 
<port>6454</port> 
<username>dude</username> 
<password>123</password> 
</server> 
</servers> 

您可以創建基於此的架構:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="servers"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="server" maxOccurs="unbounded" minOccurs="0"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element type="xs:byte" name="id"/> 
       <xs:element type="xs:string" name="url"/> 
       <xs:element type="xs:short" name="port"/> 
       <xs:element type="xs:string" name="username"/> 
       <xs:element type="xs:byte" name="password"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

然後用JAXB爲你工作有目的。我希望它能幫助你,或者至少可以給你一個想法。最好的祝福。

+0

問題是應用程序的用戶 – dazito

+0

我知道你在說什麼,我有類似的問題,我最終創建了一個友好的Swing GUI來編輯XML文件。也許你可以嘗試編輯程序編輯文件中的行,如我所說,這將是痛苦的,但你會得到你期望的結果。 –

0

如果使用FileOutputStream,您可以創建輸出文件並以您直接詢問的格式進行寫入。但是,如果您使用屬性,那麼您將無法重複相同的密鑰。

相關問題