【发布时间】:2013-12-13 15:20:32
【问题描述】:
我需要在我的 JSF 应用程序中获取一个资源文件。
InputStream input = new FileInputStream("filename.xml");
但是,系统没有找到filename.xml 文件,该文件与sample.xhtml 网页位于同一文件夹中。我如何获得它的InputStream?
【问题讨论】:
标签: file jsf resources inputstream
我需要在我的 JSF 应用程序中获取一个资源文件。
InputStream input = new FileInputStream("filename.xml");
但是,系统没有找到filename.xml 文件,该文件与sample.xhtml 网页位于同一文件夹中。我如何获得它的InputStream?
【问题讨论】:
标签: file jsf resources inputstream
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");
// ...
【讨论】: