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");
参见: