如何查找基于servlet的应用程序的工作文件夹以加载资源

Ere*_*evi 28 resources servlets relative-path working-directory absolute-path

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

- tomcat
-- webapps
--- myapp
---- index.html
---- WEB-INF
----- web.xml
----- classes
------ src
------- .....
----- MY_STATIC_FOLDER
------ file1
------ file2
------ file3
Run Code Online (Sandbox Code Playgroud)

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

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

Bal*_*usC 41

您可以使用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);
// ...
Run Code Online (Sandbox Code Playgroud)

但是,如果您的唯一目的是获取InputStream它,那么更好地使用,ServletContext#getResourceAsStream()因为getRealPath()可以null在本地磁盘文件系统上没有扩展WAR时返回(默认情况下Tomcat会这样做,但是可以配置为不这样做!):

String relativeWebPath = "/WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...
Run Code Online (Sandbox Code Playgroud)

毕竟这比java.io.File方法更强大.

也可以看看: