如何在 Struts 2 应用程序中读取文本文件 [重复]
Posted
技术标签:
【中文标题】如何在 Struts 2 应用程序中读取文本文件 [重复]【英文标题】:How can one read a text file in a Struts 2 app [duplicate] 【发布时间】:2010-12-19 12:16:17 【问题描述】:开发 Struts 2 应用程序我遇到了以下问题。我需要使用我的应用程序读取部署在 Web 服务器中的文本文件。我怎样才能知道它的相对路径来访问它。换句话说,如果我知道部署目录中的相对路径,我怎么能找到绝对路径。 当我遇到与 servlet 类似的问题时,我曾经使用 this.getContextPath() (或类似的东西)返回网络服务器中文件夹的绝对路径。
编辑: 谢谢大家的回答。对我来说是这样的:
String path=GetPointsOfInterestAction.class.getResource("../../../resources/visitor_attractions.txt")
您能否解释一下为什么我会成功,因为我是在 java 中迈出第一步。
【问题讨论】:
【参考方案1】:如果它放在 webapp 的类路径中,那么只需使用:
InputStream input = servletContext.getResourceAsStream("file.txt");
如果放在全局类路径中,则使用:
InputStream input = Thread.currentThread().getContextClassLoader().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")
请解释一下原因
这实际上不是“正确”的方式,但这也是可行的。您只需确保您知道文件的相对路径,而不是GetPointsOfInterestAction
类的实际路径。这个类当然放在不同的包中,所以您基本上需要退回一个目录(就像您在普通磁盘文件系统中所做的那样:cd ../
等等)。同样,这不是最优雅的方式。您需要使用上述前两种方式之一,资源名称为resources/visitor_attractions.txt
。
【讨论】:
【参考方案2】:Here
ServletActionContext.getServletContext()
你似乎知道从那里做什么。
【讨论】:
是的。如果我尝试以常量读取它会返回 null 的问题。这似乎是一个错误的设计决定。【参考方案3】:您可以使用Resource Bundle。我用它们来查找属性文件。我相信该目录只需要在 Classpath 上,ResourceBundle 就会找到它。
【讨论】:
【参考方案4】:如果文件在类路径上(不清楚,但这是个好主意),我建议使用实用程序 classorg.apache.struts2.util.ClassLoaderUtils
。从它的java文档:
这个类对于以跨不同应用服务器的容错方式加载资源和类非常有用。
特别注意ClassLoaderUtils.getResourceAsStream(String resourceName, Class callingClass)
静态方法,它是一种将资源作为流加载的便捷方法。如文档所述,用于查找资源的算法在getRessource()
中给出:
此方法将尝试加载 资源使用以下方法 (按顺序):
来自Thread.currentThread().getContextClassLoader()
来自ClassLoaderUtil.class.getClassLoader()
来自callingClass.getClassLoader()
【讨论】:
以上是关于如何在 Struts 2 应用程序中读取文本文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章