我试图将配置数据保存在config.properties
文件中。我正在保存我的属性:
public static void setProperty(Parameter property) {
// set the property's value
prop.setProperty(property.getIndex(), property.getValue());
// save properties to project root folder
try {
prop.store(output, null);
} catch (IOException e) {
e.printStackTrace();
}
}
并像这样加载它们:
public static String getProperty(String componentName) {
// get the property value
return prop.getProperty(componentName);
}
一切正常,但是当我重新启动程序时,我不再拥有任何属性了。我在程序开头调用以下方法来加载我的属性文件:
static String FILE = "config.properties";
static InputStream input;
static OutputStream output;
static Properties prop = new Properties();
public static void loadExistingProperties() {
try {
input = new FileInputStream(FILE);
output = new FileOutputStream(FILE);
// load properties from file
prop.load(input);
System.out.println("amount of saved properties: " + prop.size());
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
任何人都可以告诉我为什么在重新启动程序后我无法找到我的属性?是我试图让prop
错误的方式吗?我不知道如何以另一种方式做到这一点。
答案 0 :(得分:2)
在loadExistingProperties()
中,您为同一个文件打开了FileInputStream
和FileOutputStream
,但您只想从该文件中读取。调用FileOutputStream
将删除文件的内容,然后才能读取它。只需删除该行。
答案 1 :(得分:1)
我相信当你打开你的输出流时它会截断文件的内容。
编辑:
您需要打开输入流,在不打开输出流的情况下读取属性文件的内容。
如果您确实需要稍后保存它们,您仍然可以在setProperty方法中打开输出流并调用store方法。或者,您可以在读取所有属性并关闭输入流后打开输出流。
请记住,store方法将再次保存所有属性。
答案 2 :(得分:1)
第一个问题是,无论何时修改属性,都要将整个属性写入output
输出流。这不是它的工作方式。
Properties.store()
方法将存储Properties
对象中存储的所有属性。因此,您应该在调用store()
方法之前打开文件,然后在其后关闭。
在我看来,您永远不会关闭output
,这可能会导致写入数据的数据仍然只存在于内存缓存中,并且永远不会写入底层文件。
只需坚持这样的属性:
try (OutputStream out = new FileOutputStream("config.properties")) {
prop.store(out, null);
}
然后像这样加载它们:
try (InputStream in = new FileInputStream("config.properties")) {
prop.load(in);
}
try-with-resources
块将正确关闭流。
此外,每次修改属性时都不应该保留属性。常见的做法是仅在关闭程序时或用户要求您执行此操作时保存属性/设置(例如"立即保存设置"菜单)。
答案 3 :(得分:0)
我还没有看过你的Properties
课,但在我看来你没有关闭输出流也没有看到同花顺。
执行prop.store(output, null);
后文件是否会发生变化?