如何创建一个.INI文件来在Java中存储一些设置?

如何创建一个.INI文件来在Java中存储一些设置?,java,settings,configuration-files,Java,Settings,Configuration Files,我想创建一个ini文件来存储我的应用程序的一些设置。找到jar文件的位置并在那里创建ini文件是一个好主意吗?如果是,那么如何找到jar文件的位置 但是如果你知道一个更好的解决方案,我想听听其中的一些 编辑:我正在使用mac,我想在windows中运行相同的应用程序。我可以在System.getProperty(“user.home”)目录中写一些东西,但如果用户决定删除应用程序,我希望保持系统干净。没有更好的方法来存储设置文件,例如与应用程序存储在同一目录中?您不应该将临时文件存储在应用程序的

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

但是如果你知道一个更好的解决方案,我想听听其中的一些


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

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


不过,也就是说,我可能会将这类内容存储在注册表中,而不是存储在他们计算机上的文件中。(但是,那只是我的问题。)

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

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


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

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

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


相反,我会将文件写入System.getProperty(“user.home”)目录—用户的主目录,或者如果它确实是临时的,则写入System.getProperty(“java.io.tmpdir”)

您可以使用类加载器定位应用程序目录。请参阅:。使用.properties文件而不是.INI文件-您可以通过类加载和保存该文件

正如其他人所指出的,您不应该将用户设置写入应用程序目录。如果用户没有对应用程序目录的写访问权限怎么办?如果您的应用程序同时被同一系统上的多个用户使用,该怎么办?这两种情况都不常见,即使在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;
}
虽然这意味着您可能会留下散乱的文件,但如果用户重新安装应用程序,这将是有益的。在自述中记录这些事情。以下是如何创建和获取对目录的引用:

/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下,它将位于我的文档下面,所以用户不会看到目录,除非他们去寻找它。

< P>如果设置只由应用程序编写(而不是手工编辑),请考虑使用.

< P>使用.Frasic文件代替INI文件的想法是好的。此外,如果您在其中存储了一些敏感数据,您可以考虑对其加密。看看这个:

或者这个:


user.dir提供当前工作目录,该目录可能不安全或不合适。user.home为您提供了用户的主目录。假定“user.home”属性为您提供了适用于每个环境的适当值是否安全?也就是说,/home/{user}on*nix,Windows的相关文档和设置子目录,等等?这就是“user.home”应该做的。oops-是的,显然我指的是user.home(编辑以避免误导),那么在MacOS中运行相同的应用程序呢??我完全同意这篇文章。。所以我认为注册根本不是个好主意:)嗯。。。我是Java的noob,所以是的。属性是一个更好的主意。但是,当您用Java编写应用程序时,您在哪里存储设置呢。我正在使用mac,但我也想在windows环境中运行它。