我有一个非常简短的问题。我有一个使用属性文件的Java程序。该文件用于跟踪程序的用户。我的问题是我不知道如何添加到文件中。我知道如何设置现有属性的值,但我不知道如何在不覆盖其他属性的情况下添加更多属性。
我想要的程序‘注册’用户,可以这么说。每当新用户“注册”时,我希望程序添加一个包含新用户信息的新属性。但我遇到了这个问题:示例:
File: numOfUsers=0一个用户注册。用户名是'c00lGuy‘。程序将其注册到文件中:
File: numOfUsers=1 user1-username=c00lGuy另一个用户注册。她决定给自己的用户名取名为“She Gr8Girl”。该程序注册如下:
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();
}
}发布于 2014-09-27 22:07:39
尝试如下所示:
FileOutputStream out = new FileOutputStream(fileName);
props.setProperty("numOfUsers", 2);
...
props.store(out, null);
out.close();发布于 2014-09-27 22:10:49
属性文件实际上并不是为这种用途而设计的,但是如果你有一个足够小的数据集,它就可以工作。
您缺少的步骤是,您需要从磁盘读取属性,进行更改,然后将它们保存回磁盘。
Properties props = new Properties();
try{
props.load(inputStream);
} finally {
inputStream.close();
}
props.setProperty(....);
try{
props.store(outputStream);
} finally {
outputStream.close();
}请记住,这根本不适合任何类型的批量处理。此外,如果有两个线程试图同时更改属性文件,则会出现争用情况。
如果你正在寻找一个轻量级的持久化存储,我强烈推荐mapdb。
发布于 2014-09-27 22:12:50
您的代码每次都会创建一个新的Properties对象。添加用户时,请确保重用旧实例。
此文件中的行的典型格式为
user=hashedPassword因此,使用用户名作为关键字,使用密码作为值。用户数量不需要存储,它只是属性映射的大小。
https://stackoverflow.com/questions/26075439
复制相似问题