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

时间:2013-11-27 19:45:48

标签: file jsf resources inputstream

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

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

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

1 个答案:

答案 0 :(得分:8)

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

您传递给FileInputStream的任何相对路径(即任何不以驱动器号或斜线开头的路径)都是相对于当前工作目录解释的,该目录是在正好打开的时刻打开的文件夹。 Java虚拟机由java.exe命令启动。您可以按如下方式确定具体路径:

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

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

如果文件作为类路径资源放在类路径中,即您将它放在com.example包中的“Java Sources”中,那么您应该获得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");
// ...

或者,如果文件作为网络资源放在webcontent中,即您将其放在“Web内容”中的同一文件夹中,您也可以找到/WEB-INF/META-INF等等然后你应该获得InputStream如下:

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

另见: