Java 应用程序的配置文件
Config file for a Java Application
我正在构建一个 Java 应用程序,目的是将来将其打包为 windows 可执行文件。我的NetBeans项目结构可以看到
here.
我目前正在使用 getResourceAsStream() 从 config.properties 读取数据。我不知道这个文件不能以类似的方式写入。任何人都可以建议一种方法来实现这一目标,或者需要采用不同的方法来解决我的问题吗?谢谢
我想你可以用java.util.properties
来解决你的问题;写入您的属性首先创建一个新的 Properties
对象,load
them via your InputStream
, use methods such as setProperty
to add to your configuration and finally use store
写入它们。
示例:
File appConfig = new File("a_file");
FileInputStream propsInput = new FileInputStream("a_file");
Properties prop = new Properties();
prop.load(propsInput);
try (Writer inputStream = new FileWriter(appConfig)) {
// Setting the properties.
prop.setProperty("A_PROP", "A_VALUE");
// Storing the properties in the file with a heading comment.
prop.store(inputStream, "INFORMATION!!!");
} catch (IOException ex) {
ex.printStackTrace();
}
对于如何外部化配置的问题没有直接的答案 -- 这取决于应用程序及其部署环境。
Java 首选项 API 试图通过提供 platform-neutral API 首选项来解决此问题。在 Linux 上,数据实际上存储在 $HOME/.java
子目录中的 XML 文件中,当然,程序员不应该关心这个。使用这个 API 很方便,但不允许存储复杂的数据,并且不容易让程序员为应用程序提供从某个特定位置读取配置的方法。
您可以 read/write 文件,而不是使用首选项 API。对于简单的 'name=value' 配置,您可以使用 Properties
对象,它具有处理文件的方法。此方法确实允许特定的文件位置,但当然,控制文件位置确实需要针对您可能支持的各种平台进行一些调整。
如果您的配置比 'name=value' 更复杂,您可以 read/write 使用您选择的格式 -- JSON、YAML、XML 等。所有这些文件格式都是 well-supported by Java。使用 text-based 格式允许用户根据需要使用其他工具编辑配置。
实际上,我几乎总是将序列化 Java 对象中的配置外部化到一个我控制其位置的文件中。这允许配置任意复杂性而无需额外编码,因为您直接存储 Java 数据。构建一个要序列化的程序需要一些工作,但在漫长的 运行 中是值得的。不幸的是,这种方法不允许在程序外轻松编辑配置。
如果您打算 运行 容器中的应用程序(Docker 等),则需要考虑完全不同的因素。您需要使用一种与容器平台兼容的外部化配置方法——在这样的环境中,简单地读写文件通常是不合适的。
如果您不确定要如何处理配置,请在实现您定义的接口的 class 中进行。然后,如果您以后改变主意,可以提供实现相同接口的不同 class。
我正在构建一个 Java 应用程序,目的是将来将其打包为 windows 可执行文件。我的NetBeans项目结构可以看到 here. 我目前正在使用 getResourceAsStream() 从 config.properties 读取数据。我不知道这个文件不能以类似的方式写入。任何人都可以建议一种方法来实现这一目标,或者需要采用不同的方法来解决我的问题吗?谢谢
我想你可以用java.util.properties
来解决你的问题;写入您的属性首先创建一个新的 Properties
对象,load
them via your InputStream
, use methods such as setProperty
to add to your configuration and finally use store
写入它们。
示例:
File appConfig = new File("a_file");
FileInputStream propsInput = new FileInputStream("a_file");
Properties prop = new Properties();
prop.load(propsInput);
try (Writer inputStream = new FileWriter(appConfig)) {
// Setting the properties.
prop.setProperty("A_PROP", "A_VALUE");
// Storing the properties in the file with a heading comment.
prop.store(inputStream, "INFORMATION!!!");
} catch (IOException ex) {
ex.printStackTrace();
}
对于如何外部化配置的问题没有直接的答案 -- 这取决于应用程序及其部署环境。
Java 首选项 API 试图通过提供 platform-neutral API 首选项来解决此问题。在 Linux 上,数据实际上存储在 $HOME/.java
子目录中的 XML 文件中,当然,程序员不应该关心这个。使用这个 API 很方便,但不允许存储复杂的数据,并且不容易让程序员为应用程序提供从某个特定位置读取配置的方法。
您可以 read/write 文件,而不是使用首选项 API。对于简单的 'name=value' 配置,您可以使用 Properties
对象,它具有处理文件的方法。此方法确实允许特定的文件位置,但当然,控制文件位置确实需要针对您可能支持的各种平台进行一些调整。
如果您的配置比 'name=value' 更复杂,您可以 read/write 使用您选择的格式 -- JSON、YAML、XML 等。所有这些文件格式都是 well-supported by Java。使用 text-based 格式允许用户根据需要使用其他工具编辑配置。
实际上,我几乎总是将序列化 Java 对象中的配置外部化到一个我控制其位置的文件中。这允许配置任意复杂性而无需额外编码,因为您直接存储 Java 数据。构建一个要序列化的程序需要一些工作,但在漫长的 运行 中是值得的。不幸的是,这种方法不允许在程序外轻松编辑配置。
如果您打算 运行 容器中的应用程序(Docker 等),则需要考虑完全不同的因素。您需要使用一种与容器平台兼容的外部化配置方法——在这样的环境中,简单地读写文件通常是不合适的。
如果您不确定要如何处理配置,请在实现您定义的接口的 class 中进行。然后,如果您以后改变主意,可以提供实现相同接口的不同 class。