在Java中设置文件的最简单方法是什么?
显然,我希望避免将路径等硬编码到我的应用程序中,因此,我希望创建一个设置文件来存储字符串等简单内容。最简单的方法是什么?我在想Cocoa是如何使用对象持久性的,但我似乎找不到任何等价的东西 您可以使用通过类操作的文件 如果这是一个基于web的应用程序,您可以将其作为环境变量(或自定义属性)的一部分添加到app server控制台/文件中在Java中设置文件的最简单方法是什么?,java,Java,显然,我希望避免将路径等硬编码到我的应用程序中,因此,我希望创建一个设置文件来存储字符串等简单内容。最简单的方法是什么?我在想Cocoa是如何使用对象持久性的,但我似乎找不到任何等价的东西 您可以使用通过类操作的文件 如果这是一个基于web的应用程序,您可以将其作为环境变量(或自定义属性)的一部分添加到app server控制台/文件中 如果它是一个独立的应用程序,一个简单的属性文件就足够了。基于您所说的事实: 请记住我没有做任何异常处理。您需要为流执行此操作 // Save Setti
如果它是一个独立的应用程序,一个简单的属性文件就足够了。基于您所说的事实: 请记住我没有做任何异常处理。您需要为流执行此操作
// 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名称(“配置文件图片路径”)的函数)
现在,您将迭代设置文件中的所有字符串,并从每个字符串中提取字段名和值,两者都作为字符串。我不打算在这里解释如何使用反射,但其思想是,对于设置文件中的每个字段,您将使用反射在设置类中找到同名字段并检查其类型。然后将对设置文件中的值应用适当的转换方法,并使用反射将设置对象中的字段设置为转换后的值
虽然这种方法使用了反射,这是不赞成的,但它的美在于它可以推广到任何领域;您不必单独处理每个字段。如果要添加其他设置,只需添加两行:一行到设置文件,一行到设置类。您还可以扩展它来加载枚举,甚至加载其他类的实例我通常会考虑这一点,但考虑到我所要做的就是存储字符串设置,属性似乎是一个不错的选择。啊,当你开始和可可比较时,我推广了…