【问题标题】:Loading application properties in a Java desktop application在 Java 桌面应用程序中加载应用程序属性
【发布时间】:2010-01-20 17:39:16
【问题描述】:

在 Java 中存储和加载应用程序级属性的最佳方式是什么。

有什么类似于 .net 的东西,我可以在 app.config 中放一些东西

 <appSettings>
    <add key="emailAddress" value="me@example.com" />
  </appSettings>

然后像这样检索它:

string AdminEmail = ConfigurationManager.AppSettings["emailAddress"];

我必须将属性文件加载到文件流中吗?似乎是不必要的工作。

我试过这个:

Properties props = new Properties();

FileInputStream fis = new FileInputStream("myProps.properties");
props.load(fis);
fis.close();

但这给了我一个 java.io.FileNotFoundException 异常。与类相关的属性文件需要转到哪里?

【问题讨论】:

    标签: java application-settings


    【解决方案1】:

    Preferences API 提供此功能。它有很多缺点,但是如果您希望以与操作系统无关的方式来执行此操作,这是使用标准 Java 运行时库完成此操作的唯一方法。当然,您始终可以编写自己的特定于操作系统的代码来满足您的需求。是的,您可以编写简单的代码来加载属性文件,但该文件的位置可能会成为跨多个操作系统的问题。我假设由于您正在用 Java 编写桌面应用程序,因此您关心操作系统的可移植性。否则,Java 可能不是桌面应用程序的最佳选择。

    【讨论】:

      【解决方案2】:

      如果你使用这样的 FileInputStream,你的路径是相对于操作系统的当前目录,通常是启动目录。

      如果您改为使用 Java 内置资源机制(如 in the API、getResourceAsStream() 等所述),则路径将相对于您的类的位置。使用这种方法,您还可以从 jar 甚至通过网络(例如 Applet)加载资源。使用的概念是一种虚拟文件系统,在 Java 术语中称为“类路径”。有一篇devx 文章更详细地介绍了它。

      简而言之,这种代码运行良好:

      Properties prop = new Properties();
      //with properties in the same dir as current class
      prop.load(getClass().getResourceAsStream("my.properties")); 
      //with properties in the root dir of your jar, or in base of classpath
      prop.load(getClass().getResourceAsStream("/my.properties"));
      

      您将需要添加错误处理...

      【讨论】:

        【解决方案3】:

        通常它会尝试从应用程序的当前目录加载,具体取决于您运行它的方式。您应该能够在运行时通过以下方式确定这一点:

        String currentFolder = System.getProperty("user.dir");
        

        【讨论】:

          【解决方案4】:

          在这种情况下,它要查找的文件路径与您启动 Java 应用程序的位置相关。这不是主类或 jar 文件的位置,而是您调用 Java 的位置。如果您使用调用 Java 的脚本启动应用程序,那么就是该目录。

          例如,您的应用程序捆绑在一个 jar 文件“app.jar”中。将“myProps.properties”放在同一目录中,然后从该目录运行“java -jar app.jar”。它应该以这种方式找到您的属性文件。

          【讨论】:

            【解决方案5】:

            您可以将属性与 ResourceBundle 一起使用。我在应用程序中使用它来存储不同语言的标签、按钮和消息

            首先创建一个属性文件,例如 test.properties。这是一个文本文件,您可以在其中输入如下信息:

            propertyname=value
            

            你的情况

            emailAddress=me@example.com
            email2=blablabla@example.com
            

            等等……

            要在代码中获取此属性,请使用您的属性文件的名称创建一个 ResourceBundle 对象以调用这些属性。

            ResourceBundle rb = ResourceBundle.getBundle("test");
            

            要从属性文件中获取特定值,只需调用 ResourceBundle

            String value = rb.getString("emailAddress");
            

            这样,String 命名值包含名为“emailAddress”的属性的值,该属性位于 test.properties 文件中

            String value2 = rb.getString("email2");
            

            同样,名为 value2 的字符串包含名为“email2”的属性的值,该属性位于 test.properties 文件中

            【讨论】:

              【解决方案6】:

              不指定绝对路径时,选择的是当前路径。

              这不是你问的,但如果你想使用 XML 文件作为配置,你可以看看Apache Commons Configuration

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-10-15
                • 1970-01-01
                • 2012-10-17
                • 1970-01-01
                相关资源
                最近更新 更多