29

我编写了一个 Java servlet,我想将它安装在不同服务器上的许多 Tomcat 实例上。servlet 使用一些与 WEB-INF 下的 war 文件一起打包的静态文件。这是典型安装中的目录结构:

- tomcat
-- webapps
--- myapp
---- index.html
---- WEB-INF
----- web.xml
----- classes
------ src
------- .....
----- MY_STATIC_FOLDER
------ file1
------ file2
------ file3

如何知道 MY_STATIC_FOLDER 的绝对路径,以便读取静态文件?

我不能依赖“当前文件夹”(我在新文件(“.”)中得到什么),因为它取决于 Tomcat 服务器的启动位置,这在每次安装中都不同!

4

3 回答 3

44

可以使用ServletContext#getRealPath()将相对 Web 内容路径转换为绝对磁盘文件系统路径。

String relativeWebPath = "/WEB-INF/static/file1.ext";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
InputStream input = new FileInputStream(file);
// ...

但是,如果您的唯一目的是InputStream摆脱它,则最好使用它,ServletContext#getResourceAsStream()因为只要 WAR 未扩展到本地磁盘文件系统而是扩展到内存和/或虚拟磁盘,则getRealPath()可能会返回:null

String relativeWebPath = "/WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...

这比java.io.File方法更强大。此外,使用getRealPath()被认为是不好的做法。

也可以看看:

于 2011-07-05T14:14:33.510 回答
0

你可以试试这个
String relativeWebPath = "WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);

于 2011-07-05T15:06:06.920 回答
-2

我更喜欢使用 getResourceaAsStream 选项来加载基于父目录的资源。

getClass().getClassLoader().getResourceAsStream("/MY_STATIC_FOLDER/file1");
于 2011-07-05T14:16:17.920 回答