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

smdncfj3  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(355)

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

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

如何知道静态文件夹的绝对路径,以便读取静态文件?
我不能依赖“当前文件夹”(我在新文件(“.”)中得到的内容),因为它取决于tomcat服务器的启动位置,这在每个安装中都是不同的!

1sbrub3j

1sbrub3j1#

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

yws3nbqq

yws3nbqq2#

你可以用 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() 而是因为 getRealPath() 可能会回来 null 当war不是扩展到本地磁盘文件系统而是扩展到内存和/或虚拟磁盘时:

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

这比 java.io.File 接近。此外,使用 getRealPath() 被认为是坏习惯。

另请参见:

getresourceasstream()与fileinputstream
servletcontext.getrealpath(“/”)是什么意思?我应该在什么时候使用它
在基于servlet的应用程序中,在何处放置配置资源文件以及如何读取配置资源文件?
在servlet应用程序中保存上载文件的推荐方法

jk9hmnmh

jk9hmnmh3#

我更愿意使用getresourceaasstream选项基于父目录加载资源。

getClass().getClassLoader().getResourceAsStream("/MY_STATIC_FOLDER/file1");

相关问题