我有一个具有以下文件结构的JSF应用程序:
ReportGeneratorJSF
|-- src
| `-- Abc.java
|-- WebContent
| `-- FormattedExcel
| `-- abc.xls
:
在我的Abc
课程中,我需要将Excel文件称为
File file = new File("location of abc.xls");
然而,无论我尝试什么路径,它都是null
。我如何找到正确的道路?
答案 0 :(得分:3)
java.io.File
直接在本地磁盘文件系统上运行,并且完全不了解它运行的Java(EE)应用程序上下文。所以它绝对不知道应用程序“root”位于C:/some/path/to/ReportGeneratorJSF
。它假定每个相对路径都相对于“当前工作目录”,即Java虚拟机启动时当前打开的目录。
您永远不应该依赖java.io.File
正确对待的相对路径。期。
鉴于您已将其保存为项目的webcontent文件夹中的JSF webapp资源,您应该使用ExternalContext#getResourceAsStream()
来获取InputStream
(最终,您希望从FileInputStream
中创建一个File
,对吧?File
还有用吗?)。它需要一个相对于webcontent根的路径,而不是磁盘文件系统的当前工作目录。
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
InputStream input = ec.getResourceAsStream("/FormattedExcel/abc.xls");
// ...