在我的 Java EE Web 应用程序中,我需要一个地方来放置我的属性文件,我可以使用 getResource() 找到它,然后更新该文件。
将它放在 lib 目录中似乎不适用于 tomcat。建议?
应用是 GXT 需要有一个属性文件来保存国际化的字符串。我需要从数据库表中加载这些字符串。所以我必须在启动时创建属性文件。我正在创建一个空文件,该文件将放入 lib 目录中的 jar 文件中。然后我找到那个文件并用新的答案写入它。这一切都适用于码头,但不适用于tomcat。
谢谢。
在我的 Java EE Web 应用程序中,我需要一个地方来放置我的属性文件,我可以使用 getResource() 找到它,然后更新该文件。
将它放在 lib 目录中似乎不适用于 tomcat。建议?
应用是 GXT 需要有一个属性文件来保存国际化的字符串。我需要从数据库表中加载这些字符串。所以我必须在启动时创建属性文件。我正在创建一个空文件,该文件将放入 lib 目录中的 jar 文件中。然后我找到那个文件并用新的答案写入它。这一切都适用于码头,但不适用于tomcat。
谢谢。
您不一定能可靠地写入类路径位置,因为它可能不代表本地磁盘文件系统路径。您只能写入(绝对)磁盘文件系统位置。
最好的办法是拥有一个已知的固定磁盘文件系统位置,该位置又添加到类路径中,这样您就可以同时使用ClassLoader#getResource()
从类路径加载它并将FileOutputStream
其写入本地磁盘文件系统。
在 Tomcat 的情况下,您可以shared.loader
通过/conf/catalina.properties
. 例如
shared.loader = /var/webapp/conf
将表示固定磁盘文件系统位置的属性添加到属性文件本身也可能很有用。
my.location = /var/webapp/conf
这样你就可以把它读成
Properties properties = new Properties();
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("foo.properties");
并另存为
properties.store(new FileOutputStream(new File(properties.getProperty("my.location"), "foo.properties")));
//read properties
Properties prop = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("sample.properties");
prop.load(stream);
//now save back, take as URL
java.net.URL f = loader.getResource("sample.properties");
File file = new File(f.getPath());
OutputStream outstream = new FileOutputStream(file);
prop.store(outstream, "");
outstream.close();
但我会建议使用http://commons.apache.org/configuration/howto_properties.html,因为不同的功能包括在 store() 之后保持文件“用户可读”