1

我正在加载一个道具并保存它

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() as in ->将更改存储在已通过 getClass().getResourceAsStream 读取的 .properties 文件中

所以当我使用 toURI() 并运行它(jar 文件)时,它会大声说 URI is not hierarchical

当我使用时getResourceAsStream,我无法保存文件

我该怎么办?属性文件与类在同一个包中。

4

2 回答 2

4

如果您只需要加载属性,则根本不应该使用File- 您应该使用getResourceAsStream.

如果您需要再次保存属性,则不能轻松地将它们保存在 jar 文件中。每次保存时都需要重建 jar 文件 - 哎呀!

如果您确实需要两者,您可能需要考虑在第一次需要保存更改时创建一个文件:加载时,如果文件存在,则使用该文件,否则使用 jar 文件中的版本。

编辑:如果您正在构建桌面应用程序并且这些基本上是用户偏好,您应该查看PreferencesAPI。如果您要存储密码,也要非常小心......如果可能的话,请避免这样做。

于 2012-04-13T07:43:58.673 回答
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 并非每次都在每台机器上工作,但它应该每次都在旁边工作。)

于 2012-04-13T07:44:54.003 回答