2009-11-23 80 views
7

开发Struts 2应用程序我在以下问题中运行。我需要阅读使用我的应用程序部署在Web服务器中的文本文件。我怎样才能知道它的相对路径。换句话说,如果我知道部署目录内的相对路径,我如何才能找到绝对路径。 当我使用this.getContextPath()(或类似的东西)返回绝对路径到Web服务器中的文件夹时,出现类似的问题。编辑: 谢谢你们的回答。对我来说,这是:如何读取Struts 2应用程序中的文本文件

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

请你解释为什么我的工作,因为我在java中的第一步。

回答

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")); 

这些示例假定它们放在根中。您当然可以使用相对路径而不是类路径根或web内容根,例如path/to/file.txt。您可以通过ServletActionContext#getServletContext()获得Struts中的ServletContext

编辑:您有以下编辑你的问题:

编辑:谢谢你们的答案。对我来说,这个工作:

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

能否请您解释一下为什么

这实际上不是“正确”的方式,而这也是可行的。您只需确保您知道知道相对于文件的路径,而不是GetPointsOfInterestAction类的实际路径。这个类当然放在一个不同的包中,所以你基本上需要返回一个目录(就像在普通的磁盘文件系统中一样:cd ../等等)。再次,这不是最优雅的方式。您需要使用上述前两种方法之一,资源名称为resources/visitor_attractions.txt

3

Here

ServletActionContext.getServletContext()

你似乎知道从那里做。

+0

Yeap。问题是如果我尝试在常量中读取它,它将返回null。这似乎是一个错误的设计决定。 – 2009-11-23 15:30:25

3

您可以使用Resource Bundle。我用它们来查找属性文件。我相信目录只需要在Classpath上,ResourceBundle就可以找到它。

2

如果文件在类路径上(这不清楚,但这是一个好主意),我建议使用实用类org.apache.struts2.util.ClassLoaderUtils。来自java的文档:

该类对于以容错方式加载资源和类非常有用,该方法适用于不同的应用程序服务器。

特别注意ClassLoaderUtils.getResourceAsStream(String resourceName, Class callingClass)静态方法,这是一种方便的方法来将资源加载为流。作为记录,用于查找资源的算法getRessource()给出:

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

  • Thread.currentThread().getContextClassLoader()
  • ClassLoaderUtil.class.getClassLoader()
  • callingClass.getClassLoader()
相关问题