2

我可以像这样在我的 WEB-INF 文件夹中获取一个资源的 InputStream:

    ExternalContext externalContext = facesContext.getExternalContext();
    InputStream in = externalContext.getResourceAsStream("/WEB-INF/config.xml");

现在我想在运行时编辑这个文件,但我不知道如何覆盖这个文件。有没有比创建 FileOutputStream 到绝对路径更好的方法?即使不是,我仍然需要一种方法来获取文件的绝对路径(WEB-INF 文件夹的绝对路径)。

4

1 回答 1

2

至于具体问题,你可以得到文件的绝对路径,如下所示:

ExternalContext externalContext = facesContext.getExternalContext();
String realPath = externalContext.getRealPath("/WEB-INF/config.xml");
FileOutputStream output = new FileOutputStream(realPath);
// ...

至于具体的功能要求,有两个可能的主要问题:

  1. getRealPath()null当容器配置为在内存而不是磁盘上扩展 WAR 文件时将返回。那么就没有物理磁盘文件系统路径了。没有办法获得内存中位置的“文件路径”。

  2. 即使它返回一个有效路径,在本地磁盘文件系统上扩展的 WAR 结构中所做的所有更改都会在您重新部署 WAR 时丢失,甚至在某些服务器配置中也将在您重新启动服务器时丢失。原因很简单,这些更改不包含在原始 WAR 文件中。您基本上需要提取 WAR,在其中进行更改,再次打包 WAR 并触发服务器的重新部署。这在运行时没有任何意义。

换句话说,您正在寻找错误方向的解决方案。您需要准备一个固定的本地磁盘文件系统路径,并改为读取/写入它。另一种方法是使用 SQL 数据库代替或非常可能java.util.prefs.preferences

也可以看看:

于 2013-01-25T13:25:19.507 回答