【问题标题】:file load in a jar将文件加载到 jar 中
【发布时间】:2012-04-13 07:40:56
【问题描述】:

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

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 时,我无法保存文件

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

【问题讨论】:

  • @cypronmaya : 为什么程序需要修改jar文件?我想你需要重新审视需求/设计。考虑一下 jar 根本不可写的情况。
  • @Jayan 我正在尝试构建一个桌面应用程序,其中一些参数由用户设置,例如用户名/密码等,以实现我想使用属性文件,因为它更容易.
  • @ cypronmaya :您可以在 jar 的属性中设置某种默认值。将修改后的内容保存在其他地方,比如 ${user.home}。
  • @cypronmaya Jayan 是对的,请查看下面我的答案以了解应该可行的实现。

标签: java file-io properties


【解决方案1】:

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

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

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

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

【讨论】:

  • 你能不能详细说明最后一部分'如果你真的需要两者......'
  • @cypronmaya:您不理解建议的哪一点?您确定需要保存更改吗?假设您不想开始重写 jar 文件,您是否有合适的地方可以保存新的属性文件?
  • 你说的部分'你可能想考虑有一个文件,它是在你第一次需要保存更改时创建的'来保存更改?无论如何我都做不到,是的,我需要将更改至少保存到一个临时文件中,直到程序关闭等,
  • @cypronmaya:你为什么不能这样做?如果您只需要在程序关闭之前进行更改,为什么不能将它们保存在内存中?为什么要使用文件?
【解决方案2】:

试试:

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 并非每次都在每台机器上都有效,但它应该每次都在旁边有效。)

【讨论】:

  • “user.home 不适用于所有平台。” 对我来说是个消息。它以什么方式“不起作用”?在哪些平台上?
  • @AndrewThompson 我已经看到它不工作了。虽然“平台”在这里是错误的词(我会编辑它)以这个问题为例:stackoverflow.com/questions/1503284/…
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多