我有一个非常快速的问题。我有一个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();
}
}
答案 0 :(得分:0)
尝试这样的事情:
FileOutputStream out = new FileOutputStream(fileName);
props.setProperty("numOfUsers", 2);
...
props.store(out, null);
out.close();
答案 1 :(得分:0)
属性文件并非真正用于此类用途,但如果您的数据集足够小,则可以使用。
您缺少的步骤是您需要从磁盘读取属性,进行更改,然后将它们保存回磁盘。
Properties props = new Properties();
try{
props.load(inputStream);
} finally {
inputStream.close();
}
props.setProperty(....);
try{
props.store(outputStream);
} finally {
outputStream.close();
}
请记住,这根本不适用于任何类型的卷处理。此外,如果您有两个线程试图同时更改属性文件,则存在竞争条件。
如果您正在寻找轻量级持久性商店,我强烈推荐mapdb。
答案 2 :(得分:0)
您的代码每次都会创建一个新的Properties
对象。确保在添加用户时重用旧实例。
此文件中一行的典型格式为
user=hashedPassword
所以使用用户名作为密钥,密码作为值。不需要存储用户数,它只是属性映射的大小。