在 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 应用程序中读取资源文件的主要内容,如果未能解决你的问题,请参考以下文章