在Java中执行设置文件的最简单方法是什么?

时间:2011-01-02 19:12:56

标签: java

显然,我想避免将硬编码路径等应用到我的应用程序中,因此,我想创建一个设置文件来存储简单的东西,如字符串等。最简单的方法是什么?我正在思考Cocoa如何使用对象持久性的方法,但我似乎无法找到任何等价物。

8 个答案:

答案 0 :(得分:11)

您可以使用properties类操作的java.util.Properties个文件。

答案 1 :(得分:9)

基于你说的最简单的事实:

请记住,我没有做任何异常处理。您需要为Streams执行此操作。

    // Save Settings
    Properties saveProps = new Properties();
    saveProps.setProperty("path1", "/somethingpath1");
    saveProps.setProperty("path2", "/somethingpath2");
    saveProps.storeToXML(new FileOutputStream("settings.xml"), "");

    // Load Settings
    Properties loadProps = new Properties();
    loadProps.loadFromXML(new FileInputStream("settings.xml"));
    String path1 = loadProps.getProperty("path1");
    String path2 = loadProps.getProperty("path2");

答案 2 :(得分:3)

这取决于您希望如何配置应用程序以及您希望配置应用程序的人员。如果你想使用系统的本机配置机制(例如Mac OS X上〜/ Library中的PLIST文件,Gnome上的gconf,Windows上的系统注册表),那么java.util.prefs.Preferences是处理设置的正确而简单的方法/ 喜好。您仍然可能希望在Preferences之上创建自己的类,其中包含键的命名常量以及这些设置的默认值,以及可能的帮助方法来检索它们。以下是如何使用它的示例:

// Class to wrap some settings
public class AnimationSettings {
    private static final String VELOCITY_KEY = "velocity";
    private static final double VELOCITY_DEFAULT = 5.0;

    public static double getVelocity() {
        return getPrefs().getDouble(VELOCITY_KEY, VELOCITY_DEFAULT);
    }

    public static void setVelocity(int velocity) {
         getPrefs().putDouble(VELOCITY_KEY, velocity);
    }

    public static void sync() {
         getPrefs().sync();
    }

    private static Preferences getPrefs() {
        if (preferences_ == null) {
           preferences_ = Preferences.userNodeForPackage(AnimationSettings.class);
        }
        return preferences_;
    }

    private static Preferences preferences_ = null;
};

// Elsewhere in the application:
//...
double velocity = AnimationSettings.getVelocity();
// ...

也就是说,Preferences类不会为您提供跨平台配置应用程序的单一方法,并且它不一定会为您提供配置文件。为此,XML / * .properties文件也是一些可能的解决方案,正如其他一些回答者所建议的那样。然而,使用XML和属性文件的一个缺点是,您必须处理它们应该去哪里,如何查找它们,是否要让多个这样的文件覆盖另一个(例如系统设置和用户设置) ,如果文件不在那里该怎么办,等等。优惠很好地处理这些事情。

答案 3 :(得分:1)

您是否考虑过基本对象序列化并将结果写入文件?只要您的首选项在首选项对象的图形中实现Serializable,您就可以毫无问题地将它们序列化。

属性文件很好,但它们对二进制数据或持久性不灵活。

答案 4 :(得分:1)

通常有两种不同的方式。一种语言特定和一般。 存储设置的一般方法是属性文件,可以由Properties类读取。 请参阅this

存储属性的特定于语言的方法是为每种语言提供属性文件,并使用默认属性文件进行回退。您可以使用Resource类并提供区域设置来阅读这些内容。 请参阅this

答案 5 :(得分:0)

如果这是基于Web的应用程序,您可以将它们作为环境变量(或自定义属性)的一部分添加到应用服务器控制台/文件中。

如果它是一个独立的应用程序,一个简单的属性文件就足够了。

答案 6 :(得分:0)

如果要构建Web应用程序,请使用Spring 3.0。您可以在web.xml和Dispatcher-servlet.xml文件中定义bean。

通常,像Jetty和Tomcat这样的Web容器允许您定义环境变量。这具有允许这些变量从服务器更改为服务器而无需重新编译或重建WAR文件的额外好处。

我通常使用这种方法,因此我可以从开发服务器部署到登台服务器和生产服务器,而无需经常使用代码或WAR文件。

答案 7 :(得分:0)

我建议您(和可能正在阅读此书的任何人)您考虑使用Reflection API。请注意,虽然通常在生产代码中使用反射被认为是错误的做法。

您可以使用设置文件中的所有不同字段定义一个类:

public class Settings {
    public String name;
    public int age;
    public String profilePicturePath;
    public double rating;
}

您的设置文件可能如下所示:

name=John
age=30
profilePicturePath=images/john.png
rating=8.5

重要的是,设置文件中的字段名称必须与类中的字段名称相匹配。如果没有,您总是可以编写一个将它们转换的函数(例如,将带有空格的设置文件字段名称(“配置文件图片路径”)转换为驼峰名称(“ profilePicturePath”)的函数。

现在,您将遍历设置文件中的所有字符串,并从每个字符串中提取字段名称和值,两者均作为字符串。我不会在这里解释如何使用反射,但是其想法是,对于设置文件中的每个字段,您将使用反射在具有相同名称的Settings类中查找该字段并检查其类型。然后,您将对设置文件中的值应用适当的转换方法,并使用反射将Settings对象中的字段设置为转换后的值。

尽管这种方法使用了反射,但人们对此并不满意,但它的优点在于可以将其推广到任何领域。您不必单独处理每个字段。如果要添加其他设置,只需添加两行:一行到您的设置文件,另一行到您的Settings类。您还可以扩展它以加载枚举,甚至可以加载其他类的实例!