Servlets 如何在Struts 2应用程序中读取文本文件

Servlets 如何在Struts 2应用程序中读取文本文件,servlets,jakarta-ee,configuration,resources,Servlets,Jakarta Ee,Configuration,Resources,开发Struts 2应用程序时,我遇到了以下问题。我需要读取我的应用程序部署在web服务器中的文本文件。知道它的相对路径,我如何访问它。换句话说,如果我知道已部署目录中的相对路径,我如何才能找到绝对路径。 当我遇到servlets的类似问题时,我使用这个.getContextPath()(或类似的东西)返回Web服务器中文件夹的绝对路径 编辑: 谢谢你们的回答。对我来说: String path=GetPointsOfInterestAction.class.getResource("../..

开发Struts 2应用程序时,我遇到了以下问题。我需要读取我的应用程序部署在web服务器中的文本文件。知道它的相对路径,我如何访问它。换句话说,如果我知道已部署目录中的相对路径,我如何才能找到绝对路径。 当我遇到servlets的类似问题时,我使用这个.getContextPath()(或类似的东西)返回Web服务器中文件夹的绝对路径

编辑: 谢谢你们的回答。对我来说:

String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt")
String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt")
您能解释一下为什么我用java做了第一步,所以它能工作吗。

ServletActionContext.getServletContext()


你似乎知道该怎么做了。

你可以用一个。我使用它们来查找属性文件。我相信目录只需要位于类路径上,ResourceBundle就会找到它。

如果它位于webapp的类路径中,那么只需使用:

InputStream input = servletContext.getResourceAsStream("file.txt");
InputStream input = new FileInputStream(servletContext.getRealPath("file.txt"));
如果它位于全局类路径中,则使用:

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt");
如果将其放置在webcontent中,则只需使用:

InputStream input = servletContext.getResourceAsStream("file.txt");
InputStream input = new FileInputStream(servletContext.getRealPath("file.txt"));
这些示例假定它们位于根目录中。当然,您可以使用相对路径,而不是类路径根或webcontent根,例如
path/to/file.txt
。您可以通过
ServletActionContext\getServletContext()
在Struts中获得
ServletContext

编辑:您用以下内容编辑了您的问题:

编辑:谢谢你们的回答。对我来说:

String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt")
String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt")
你能解释一下原因吗


这实际上不是“正确”的方法,但这也是可行的。您只需要确保知道文件的相对路径,而不是
GetPointsOfInterestAction
类的实际路径。这个类当然放在另一个包中,所以您基本上需要返回一个目录(就像您在普通磁盘文件系统中所做的那样:
cd../
等等)。同样,这不是最优雅的方式。您需要使用前面提到的两种方法之一,如果文件位于类路径上(不清楚,但这是一个好主意),我建议使用实用程序类。从其java文档中:

此类对于以容错方式加载资源和类非常有用,这种方式可以跨不同的应用程序服务器工作

请特别注意静态方法,它是一种将资源作为流加载的方便方法。如文件所述,用于查找资源的算法如下所示:

此方法将尝试加载 资源,请使用以下方法 (按顺序):

  • Thread.currentThread().getContextClassLoader()
  • ClassLoaderUtil.class.getClassLoader()
  • 从调用class.getClassLoader()的

是的。问题是,如果我尝试在常量中读取它,它将返回null。这似乎是一个错误的设计决策。