21

我想创建一个 ini 文件来存储我的应用程序的一些设置。找到 jar 文件所在的位置并在那里创建一个 ini 文件是个好主意吗?如果是,那么我怎样才能找到 jar 文件的位置?

但是,如果您知道此类问题的更好解决方案,我想听听其中的一些。

编辑:我正在使用 mac,我想在 Windows 中运行相同的应用程序。我可以在 System.getProperty("user.home") 目录中写一些东西,但如果用户决定删除应用程序,我想保持系统清洁。没有更好的方法来存储设置文件,例如与应用程序在同一目录中?

4

6 回答 6

22

您可以使用 ClassLoader 找到您的应用程序目录。请参阅:Java:查找应用程序目录。使用.properties文件而不是.INI文件- 您可以通过Properties类加载和保存它。

正如其他人所指出的,您不应将用户设置写入应用程序目录。如果用户对应用程序目录没有写权限怎么办?如果您的应用程序同时被同一系统上的多个用户使用怎么办?这些情况都不是不寻常的,即使在 Windows 上也是如此。

您可能仍想从应用程序目录加载一些设置——也许管理员已经在那里配置了默认设置。

一个常见的约定是将用户设置保存到用户的主目录:

/home/user/.eclipse
C:\Documents and Settings\User\.eclipse

尽管这意味着您可能会留下杂散文件,但如果用户重新安装应用程序,这可能会有所帮助。在自述文件中记录这些内容。以下是如何创建和获取对目录的引用:

public static File getSettingsDirectory() {
    String userHome = System.getProperty("user.home");
    if(userHome == null) {
        throw new IllegalStateException("user.home==null");
    }
    File home = new File(userHome);
    File settingsDirectory = new File(home, ".myappdir");
    if(!settingsDirectory.exists()) {
        if(!settingsDirectory.mkdir()) {
            throw new IllegalStateException(settingsDirectory.toString());
        }
    }
    return settingsDirectory;
}

在类 unix 操作系统上,以句点 (".myappdir") 开头的目录名称将使目录隐藏。在 Windows 上,它将位于My Documents下方,因此用户不会看到该目录,除非他们去寻找它。

于 2008-10-11T11:35:11.810 回答
8

如果设置仅由您的应用程序编写(而不是手动编辑),请考虑使用Preferences API

于 2008-10-11T12:01:32.270 回答
1

您不应该将临时文件存储在应用程序的安装目录中。请记住,运行应用程序的用户可能没有对该目录的写入权限。放置此类内容的最安全位置是 C:\Documents and Settings\username\Application Data\ApplicationName 文件夹(根据需要调整名称)。

尽管如此,我可能会将这种类型的东西存储在注册表中,而不是他们计算机上的文件中。(但是,这只是我。)

于 2008-10-11T00:39:28.670 回答
1

这取决于您的 ini 在正常情况下是否需要人类可读/可写。如果没有,您可以使用属性文件而不是 ini 文件,并将其存储在“用户”目录中。

至于查找 jar 文件,您必须找到已知从 jar 加载的类的 ClassLoader,检查它是否是适当类型的 ClassLoader(即它确实是从 jar 加载的),然后您可以提取从那的路径。如果这真的是你想要的,我可能会挖掘出代码来做到这一点。我不一定会推荐它。

编辑user.home 属性将为您提供可以安全使用的用户目录。

于 2008-10-11T00:42:01.987 回答
1

通常,Java 程序员不使用 .ini 文件,而是使用 .properties 文件(不同的格式)。如果你愿意,你可以使用 java.lang.Properties 类作为一个很好的编程包装器。

虽然您可以通过调用类的 .class 成员的 getProtectionDomain().getCodeSource().getLocation() 来获取 jar 文件的位置,但我建议您这样做。

我会将文件写入 System.getProperty("user.home") 目录 - 用户的主目录,或者如果它真的是临时的,则 System.getProperty("java.io.tmpdir")

于 2008-10-11T00:46:47.157 回答
1

使用 .properties 文件而不是 INI 文件的想法很好。此外,如果您在其中存储一些敏感数据,您可以考虑对其进行加密。看一下这个:

https://www.owasp.org/index.php/How_to_encrypt_a_properties_file

或这个:

在java中加密和解密属性文件值

于 2012-01-19T17:18:54.663 回答