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

3
我需要在我的JSF应用程序中获取一个资源文件。
InputStream input = new FileInputStream("filename.xml");

然而,系统无法找到与 sample.xhtml 网页位于同一文件夹中的 filename.xml 文件。我该如何获得它的 InputStream

1个回答

11

FileInputStream 直接在本地磁盘文件系统上运行,它并不知道应用程序正在运行的上下文。它绝对不知道WAR文件结构、类路径资源和Web资源。

任何相对路径(即任何未以驱动器号或斜杠开头的路径)都将被解释为相对于当前工作目录,这是在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");
// ...

或者,如果文件作为Web资源放置在webcontent中,即您将其放置在与/WEB-INF/META-INF等相同的文件夹中的“Web Content”中,则应按以下方式获取其InputStream

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

参见:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接