我正在加载一个道具并保存它
File propfile=new File(getClass().getResource("credentials.properties").toURI());
prop.load(new FileInputStream(propfile));
prop.setProperty("a", username);
prop.setProperty("c", password);
prop.setProperty("b", pbKey);
prop.store(new FileOutputStream(propfile), null);
当我通常在netbeans中运行它很好的时候,当它捆绑到.jar文件中它会抛出
Caused by: java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.(Unknown Source)
现在我使用
getClass().getResourceAsStream("credentials.properties");
我可以读取该文件,但除非我使用.toURI()
,否则我无法保存该文件
如在 - > Storing changes in .properties file that has been read via getClass().getResourceAsStream
所以当我使用toURI()和运行它(jar文件)时,它会喊出URI is not hierarchical
当我使用getResourceAsStream
时,我无法保存文件
我该怎么办? 属性文件与类在同一个包中。
答案 0 :(得分:4)
如果您只需加载属性,则根本不应使用File
- 您应该使用getResourceAsStream
。
如果您需要再次保存属性,则无法轻松将它们放在jar文件中。每次保存时都需要重建jar文件 - ick!
如果确实需要两者,您可能需要考虑在第一次需要保存更改时创建一个文件:加载时,使用该文件(如果存在),但使用版本否则在jar文件中。
编辑:如果您正在构建桌面应用程序并且这些基本上是用户首选项,那么您应该查看Preferences
API。如果您正在存储密码,也应该非常小心......如果可能的话,请避免这样做。
答案 1 :(得分:1)
尝试:
File userFile = new File(System.getProperty("user.home"), "myProgram.properties");
if(userFile.exists()) {
prop.load(new FileInputStream(userFile));
} else {
prop.load(getClass().getResourceAsStream("credentials.properties"));
}
prop.setProperty("a", username);
prop.setProperty("c", password);
prop.setProperty("b", pbKey);
prop.store(new FileOutputStream(userFile), null);
(请注意,user.home在每台计算机上都不起作用,但每次都应该可以正常工作。)