我能够获取 WEB-INF 文件夹中资源的输入流,如下所示:
ExternalContext externalContext = facesContext.getExternalContext();
InputStream in = externalContext.getResourceAsStream("/WEB-INF/config.xml");
现在我想在运行时编辑此文件,但我不知道如何覆盖该文件。 有没有比创建绝对路径的 FileOutputStream 更好的方法?即使没有,我仍然需要一种方法来获取文件的绝对路径(WEB-INF 文件夹的绝对路径)。
最佳答案
具体问题,可以通过如下方式获取文件的绝对路径:
ExternalContext externalContext = facesContext.getExternalContext();
String realPath = externalContext.getRealPath("/WEB-INF/config.xml");
FileOutputStream output = new FileOutputStream(realPath);
// ...
就具体的功能需求而言,可能存在两个主要问题:
-
当容器配置为在内存而不是磁盘上扩展 WAR 文件时,
getRealPath()
将返回null
。那么就没有物理磁盘文件系统路径的方法了。无法获取内存中位置的“文件路径”。即使它返回有效路径,每当您重新部署 WAR 时,甚至在某些服务器配置中,当您刚刚重新启动服务器时,本地磁盘文件系统上的扩展 WAR 结构中所做的所有更改都将丢失。原因很简单,这些更改不包含在原始 WAR 文件中。您基本上需要提取 WAR,在其中进行更改,再次打包 WAR 并触发服务器的重新部署。这在运行时没有任何意义。
换句话说,您正在寻找错误的解决方案。您需要准备一个固定的本地磁盘文件系统路径并对其进行读/写。另一种选择是使用 SQL 数据库,或者很可能 java.util.prefs.preferences
.
另请参阅:
关于jakarta-ee - 在应用程序运行时编辑 WEB-INF 中的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14519427/