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