Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中设置文件的最简单方法是什么?_Java - Fatal编程技术网

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

在Java中设置文件的最简单方法是什么?,java,Java,显然,我希望避免将路径等硬编码到我的应用程序中,因此,我希望创建一个设置文件来存储字符串等简单内容。最简单的方法是什么?我在想Cocoa是如何使用对象持久性的,但我似乎找不到任何等价的东西 您可以使用通过类操作的文件 如果这是一个基于web的应用程序,您可以将其作为环境变量(或自定义属性)的一部分添加到app server控制台/文件中 如果它是一个独立的应用程序,一个简单的属性文件就足够了。基于您所说的事实: 请记住我没有做任何异常处理。您需要为流执行此操作 // Save Setti

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

您可以使用通过类操作的文件

如果这是一个基于web的应用程序,您可以将其作为环境变量(或自定义属性)的一部分添加到app server控制台/文件中


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

基于您所说的事实:

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

    // 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");

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

通常,Jetty和Tomcat等web容器允许您定义环境变量。这样做的另一个好处是允许这些变量在不同的服务器之间更改,而无需重新编译或重建WAR文件


我通常使用这种方法,这样我就可以从开发服务器部署到暂存服务器和生产服务器,而无需不断修改代码或WAR文件。

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


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

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

// 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和属性文件的一个缺点是,您必须处理它们应该放在哪里,如何查找它们,是否希望多个这样的文件一个覆盖另一个(例如,系统设置和用户设置),如果文件不在那里怎么办,“首选项”可以很好地处理这类事情。

通常有两种不同的方法。一种特定语言和一种通用语言。 存储设置的一般方法是在properties类可以读取的properties文件中。 请看

存储属性的特定于语言的方法是为每种语言提供一个属性文件,并为备用目的提供一个默认文件。您可以通过使用资源类并提供区域设置来读取这些内容。 请看 您可以使用设置文件中的所有不同字段定义一个类:

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
设置文件中的字段名与类中的字段名匹配非常重要。如果他们没有;您始终可以编写一个函数来转换它们(例如,将带有空格的设置文件字段名(“配置文件图片路径”)转换为camelCase名称(“配置文件图片路径”)的函数)

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


虽然这种方法使用了反射,这是不赞成的,但它的美在于它可以推广到任何领域;您不必单独处理每个字段。如果要添加其他设置,只需添加两行:一行到设置文件,一行到设置类。您还可以扩展它来加载枚举,甚至加载其他类的实例

我通常会考虑这一点,但考虑到我所要做的就是存储字符串设置,属性似乎是一个不错的选择。啊,当你开始和可可比较时,我推广了…