如何读取Struts 2应用程序中的文本文件
开发Struts 2应用程序我在以下问题中运行。我需要阅读使用我的应用程序部署在Web服务器中的文本文件。我怎样才能知道它的相对路径。换句话说,如果我知道部署目录内的相对路径,我如何才能找到绝对路径。 当我使用this.getContextPath()(或类似的东西)返回绝对路径到Web服务器中的文件夹时,出现类似的问题。编辑: 谢谢你们的回答。对我来说,这是:如何读取Struts 2应用程序中的文本文件
String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt")
请你解释为什么我的工作,因为我在java中的第一步。
如果它被放置在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
。
如果文件在类路径上(这不清楚,但这是一个好主意),我建议使用实用类org.apache.struts2.util.ClassLoaderUtils
。来自java的文档:
该类对于以容错方式加载资源和类非常有用,该方法适用于不同的应用程序服务器。
特别注意ClassLoaderUtils.getResourceAsStream(String resourceName, Class callingClass)
静态方法,这是一种方便的方法来将资源加载为流。作为记录,用于查找资源的算法getRessource()
给出:
此方法将尝试使用以下方法 加载 资源(按顺序):
- 从
Thread.currentThread().getContextClassLoader()
- 从
ClassLoaderUtil.class.getClassLoader()
- 从
callingClass.getClassLoader()
Yeap。问题是如果我尝试在常量中读取它,它将返回null。这似乎是一个错误的设计决定。 – 2009-11-23 15:30:25