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

时间:2009-11-23 14:59:38

标签: servlets java-ee configuration resources

开发Struts 2应用程序我遇到以下问题。我需要阅读使用我的应用程序部署在Web服务器中的文本文件。如何知道它的相对路径来访问它。换句话说,如果我知道部署目录中的相对路径,我怎么能找到绝对路径。 当我遇到与servlet类似的问题时,我曾使用this.getContextPath()(或类似的东西)返回网络服务器中文件夹的绝对路径。

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

String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt")

你能否解释一下我的工作原因,因为我在java中迈出了第一步。

4 个答案:

答案 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)

Here

ServletActionContext.getServletContext()

你似乎知道该怎么做。

答案 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()
  •