开发Struts 2应用程序我遇到以下问题。我需要阅读使用我的应用程序部署在Web服务器中的文本文件。如何知道它的相对路径来访问它。换句话说,如果我知道部署目录中的相对路径,我怎么能找到绝对路径。 当我遇到与servlet类似的问题时,我曾使用this.getContextPath()(或类似的东西)返回网络服务器中文件夹的绝对路径。
编辑: 谢谢你们的回答。对我来说,这是:
String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt")
你能否解释一下我的工作原因,因为我在java中迈出了第一步。
答案 0 :(得分:10)
如果它被放置在webapp的类路径中,那么只需使用:
InputStream input = servletContext.getResourceAsStream("file.txt");
如果它被放置在全局类路径中,则使用:
InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt");
如果它被放置在webcontent中,那么只需使用:
InputStream input = new FileInputStream(servletContext.getRealPath("file.txt"));
这些示例假定它们位于根目录中。您当然可以使用相对路径而不是类路径根或webcontent根,例如path/to/file.txt
。您可以通过ServletContext
获取Struts中的ServletActionContext#getServletContext()
。
编辑:您使用以下内容编辑了您的问题:
编辑:谢谢你们的回答。对我来说,这是:String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt")
你能解释一下为什么
这实际上不是“正确”的方式,但这也是可行的。您只需要确保知道文件的相对路径,而不是GetPointsOfInterestAction
类的实际路径。这个类当然放在一个不同的包中,所以你基本上需要返回一个目录(就像你在普通磁盘文件系统中那样:cd ../
等等)。同样,这不是最优雅的方式。您需要使用前两种方法之一,资源名称为resources/visitor_attractions.txt
。
答案 1 :(得分:3)
答案 2 :(得分:3)
您可以使用Resource Bundle。我用它们来查找属性文件。我相信该目录只需要在Classpath上,而ResourceBundle就会找到它。
答案 3 :(得分:2)
如果文件在类路径上(不清楚,但这是一个好主意),我建议使用实用程序类org.apache.struts2.util.ClassLoaderUtils
。从它的java文档:
此类对于以跨容错的方式加载资源和类非常有用,这种方式适用于不同的应用程序服务器。
特别注意ClassLoaderUtils.getResourceAsStream(String resourceName, Class callingClass)
静态方法,这是一种将资源作为流加载的便捷方法。如文档所述,用于查找资源的算法在getRessource()
:
此方法将尝试加载 资源使用以下方法 (按顺序):
- 来自
Thread.currentThread().getContextClassLoader()
- 来自
ClassLoaderUtil.class.getClassLoader()
- 来自
callingClass.getClassLoader()