2014-09-27 99 views
0

我有一个真正的快速问题。我有一个Java程序,我在其中使用属性文件。该文件用于跟踪程序的用户。我的问题是我无法弄清楚如何添加到文件。我知道如何将现有的属性设置为一个值,但我不知道如何添加更多的属性,而不用重写其他属性。如何使用Java为属性文件添加属性?

我想让程序“注册”用户,可以这么说。每当新用户注册时,我希望程序添加一个包含新用户信息的新属性。我遇到这个问题,但: 例如:

File: numOfUsers=0 

一个用户注册。用户名是'c00lGuy'。程序在文件中注册:

File: numOfUsers=1 user1-username=c00lGuy 

另一个用户注册。她决定打电话给她的用户名'theGr8Girl'。该程序注册的:

File: numOfUsers=2 user2-username=theGr8Girl 

两个用户注册后的文件:

File: numOfUsers=2 user2-username=theGr8Girl 

如何防止从该文件在覆盖现有生产线我的程序?它似乎删除文件的内容,然后添加我告诉它的内容。我不希望它删除文件的内容。

我使用注册的属性代码:

Properties prop = new Properties(); 
OutputStream output = null; 

int userCount = getUserCount(); 
userCount++; 

try { 

    output = new FileOutputStream(fileName); 

    // set the properties value 
    prop.setProperty("numOfUsers", String.valueOf(userCount)); 
    prop.setProperty("user" + userCount + "-username", username); 

    // save properties to project root folder 
    prop.store(output, null); 

} catch (IOException io) { 
    io.printStackTrace(); 
} finally { 
    if (output != null) 
     try { 
      output.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

} 
+3

这不是属性文件的用途。它们被设计成由人类提供的(只读)配置。你在谈论坚持状态;你应该使用一个数据库(或至少,一个单独的文件)。 – 2014-09-27 14:02:54

+0

@OliverCharlesworth好的。谢谢。我会检查出来的。 – Rane 2014-09-27 14:09:35

+0

@Rane - 你是否必须使用属性,或者你只是寻找一种快速简单的方法来保存数据? – Chris 2014-09-27 14:09:55

回答

0

尝试是这样的:

FileOutputStream out = new FileOutputStream(fileName); 
props.setProperty("numOfUsers", 2); 
... 
props.store(out, null); 
out.close(); 
+1

这是一个非常糟糕的主意。 – 2014-09-27 14:08:35

+0

@Oliver Charlesworth:我没有说这是一个好主意,但它是可能的。我同意用户应该存储在数据库中。 – 2014-09-27 14:21:07

0

属性文件并没有真正用于这种用途的,但如果你有一个足够小的数据集就可以工作。

您缺少的步骤是您需要从磁盘读取属性,进行更改,然后将其保存回磁盘。

Properties props = new Properties(); 
try{ 
    props.load(inputStream); 
} finally { 
    inputStream.close(); 
} 
props.setProperty(....); 
try{ 
    props.store(outputStream); 
} finally { 
    outputStream.close(); 
} 

请记住,这不适用于任何类型的卷处理。另外,如果您有两个线程同时尝试更改属性文件,则会出现竞争条件。

如果你正在寻找一个轻量级的持久存储,我强烈建议mapdb

0

您的代码每次都会创建一个新的Properties对象。确保在添加用户时重新使用旧实例。

在这个文件中的行的典型格式是

user=hashedPassword 

所以使用用户名作为密钥和密码的值。用户数量不需要存储,它只是属性图的大小。