我正在构建一个Java应用程序,打算将来将其打包为windows可执行文件。我目前正在使用getResourceAsStream()从config.properties中读取,可以看到我的NetBeans项目结构。我不知道这个文件不能以类似的方式写入。有没有人能建议一种方法来实现这一点,或者需要一种不同的方法来解决我的问题?谢谢。
发布于 2020-10-11 06:12:39
我认为您可以使用java.util.properties
来解决您的问题;要写入您的属性,首先创建一个新的Properties
对象,通过您的InputStream
对它们进行load
,然后使用诸如setProperty
之类的方法添加到您的配置中,最后使用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();
}
发布于 2020-10-11 15:47:05
对于如何外部化配置的问题,没有简单的答案--它取决于应用程序和部署它的环境。
Java首选项API试图通过为首选项提供平台中立的API来解决这个问题。在Linux上,数据实际上存储在$HOME/.java
的子目录下的XML文件中,当然,程序员不应该关心这个问题。使用此API很方便,但不允许存储复杂的数据,也不允许程序员轻松地为应用程序提供从某个特定位置读取配置的方法。
您可以显式地读/写文件,而不是使用preferences API。对于简单的“name=value”配置,您可以使用Properties
对象,该对象具有处理文件的方法。这种方法确实允许特定的文件位置,但当然,控制文件位置确实需要对您可能支持的各种平台进行一些调整。
如果您的配置比'name=value‘更复杂,您可以用您选择的格式来读/写它-- JSON、YAML、XML等。所有这些文件格式都得到了Java的很好支持。使用基于文本的格式允许用户使用其他工具编辑配置。
在实践中,我几乎总是将序列化Java对象中的配置外部化到一个位置由我控制的文件中。这允许在不需要额外编码的情况下配置任意的复杂性,因为您直接存储Java数据。构建一个要序列化的程序需要做一些工作,但从长远来看,这是值得的。不幸的是,这种方法不允许在程序之外轻松地编辑配置。
如果您打算在容器(Docker等)中运行应用程序,则需要考虑完全不同的注意事项。您需要使用一种与容器平台兼容的外部化配置的方法--在这样的环境中,简单地读写文件通常是不合适的。
如果您不确定如何处理配置,请在实现您定义的接口的类中进行配置。然后,如果您后来改变了主意,您可以提供实现相同接口的不同类。
https://stackoverflow.com/questions/64298538
复制相似问题