我需要在我的JSF应用程序中获取资源文件。
InputStream input = new FileInputStream("filename.xml");
但是,系统找不到filename.xml
文件,该文件与sample.xhtml
网页位于同一文件夹中。我如何得到它InputStream
?
答案 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");
// ...