在 JSF 应用程序中读取资源文件

Posted

技术标签:

【中文标题】在 JSF 应用程序中读取资源文件【英文标题】:Read a resource file inside JSF application 【发布时间】:2013-12-13 15:20:32 【问题描述】:

我需要在我的 JSF 应用程序中获取一个资源文件。

InputStream input = new FileInputStream("filename.xml");

但是,系统没有找到filename.xml 文件,该文件与sample.xhtml 网页位于同一文件夹中。我如何获得它的InputStream

【问题讨论】:

【参考方案1】:

FileInputStream 直接在本地磁盘文件系统上工作。它对应用程序运行的上下文一无所知。它绝对不了解 WAR 文件结构、类路径资源和 Web 资源。

您传递给FileInputStream 的任何相对路径(即任何不以驱动器号或斜杠开头的路径)都被解释为相对于当前工作目录,即在Java 虚拟机打开的那一刻的文件夹机器由java.exe 命令启动。具体路径如下:

System.out.println(new File(".").getAbsolutePath());

不是您预期的位置的可能性很大。否则你不会首先问这个问题。通常它是指 IDE 的工作区文件夹,或服务器的二进制文件夹,或命令提示符下当前打开的文件夹,具体取决于您启动服务器的方式。

如果文件作为类路径资源放置在类路径中,即您将其放置在 com.example 包中的“Java 源”中,那么您应该获得它的 InputStream,如下所示:

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/example/filename.xml");
// ...

或者,如果保证它对与当前类相同的类加载器可见,并且您不在静态上下文中,那么您也可以这样做(是的,使用前导斜杠而不是上下文类加载器!):

InputStream input = getClass().getResourceAsStream("/com/example/filename.xml");
// ...

或者,如果它与当前类在同一个包中:

InputStream input = getClass().getResourceAsStream("filename.xml");
// ...

或者,如果文件作为网络资源放置在网络内容中,即您将其放置在与/WEB-INF/META-INF 等相同的文件夹中的“网络内容”中,那么您应该如下获得InputStream

InputStream input = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/filename.xml");
// ...

另见:

getResourceAsStream() vs FileInputStream Accessing properties file in a JSF application programmatically Where to place and how to read configuration resource files in servlet based application? What does servletcontext.getRealPath("/") mean and when should I use it

【讨论】:

以上是关于在 JSF 应用程序中读取资源文件的主要内容,如果未能解决你的问题,请参考以下文章

读取托管 bean 中的资源包属性

从 JSF 中的托管 bean 获取资源文件的路径

如何从过滤器中读取 JSF 会话 bean?

jsf 2.0 上的 JSF1064“无法找到或提供资源”警告

Android读取assets目录下的视屏资源

java程序读取资源文件时路径如何指定