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

oll*_*llo 3 resources jsf inputstream file

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

InputStream input = new FileInputStream("filename.xml");
Run Code Online (Sandbox Code Playgroud)

但是,系统找不到filename.xmlsample.xhtml网页位于同一文件夹中的文件.我怎么得到InputStream它?

Bal*_*usC 10

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

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

System.out.println(new File(".").getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)

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

如果文件作为类路径资源放在类路径中,即您将它放在com.example包中的"Java Sources"中,那么您应该InputStream按如下方式获取它:

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/example/filename.xml");
// ...
Run Code Online (Sandbox Code Playgroud)

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

InputStream input = getClass().getResourceAsStream("/com/example/filename.xml");
// ...
Run Code Online (Sandbox Code Playgroud)

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

InputStream input = getClass().getResourceAsStream("filename.xml");
// ...
Run Code Online (Sandbox Code Playgroud)

或者,如果文件作为Web资源放在webcontent中,即您将其放在"Web Content"中与您也可以找到的文件夹中/WEB-INF,/META-INF依此类推,那么您应该InputStream按如下方式获取它:

InputStream input = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/filename.xml");
// ...
Run Code Online (Sandbox Code Playgroud)

也可以看看: