2012-03-19 73 views
2

我建立一个WAR/EAR和我的部件之一,在许多自定义配置文件中读取使用文件IO:如何使用字符串路径名在WAR中打开资源文件?

Reader reader = new BufferedReader(new FileReader(path)); 

路径以上是作为属性通过Spring的传递给这个类的字符串applicationContext.xml文件。

如果我想将所有这些配置文件放在WAR中,我需要指定什么字符串路径?这甚至可以完成?或者是组件不正确,应该使用getResourceAsStream()代替?

我浏览并发现大量的信息在getResource()URI。然而,我找不到是否有可能创建正确的文件路径到内的资源applicationContext.xml

回答

5

在春天的环境,最好使用spring resources API 简单的例子:

@Inject 
private ResourceLoader resourceLoader; 

public void someMethod() { 
    Resource resource = resourceLoader.getResource("file:my-file.xml"); 
    InputStream is = null; 
    try { 
     is = resource.getInputStream(); 
     // do work 
     .... 
    } finally { 
     IOUtils.closeQuetly(is); 
    } 
} 

如果要访问外部文件(非classpath下的资源,应位于META-INF /资源存档内)如果使用非固定路径,则应将这些路径放在主属性文件中并将其加载到应用程序部署中。

编辑:更改@Resource to @Inject示例

3

访问文件的关键是让它们在你的类路径中可用。默认情况下,在WAR文件中,WEB-INF/classes下的所有文件都会添加到类路径中,并且您可以引用这些文件。

例如:让我们假设这是你的WAR文件结构

webapp.war 
| 
|---> WEB-INF 
|------| 
|  |----> classes 
|    |----> MyResource.properties 
|---> index.html 
|---> images 
|-------| 
|  ----> logo.gif 

您可以访问 “MyResource.properties” 使用下面的API

Reader reader = new BufferedReader(new FileReader("MyResource.properties")); 

希望这有助于。

祝你好运!

+1

让您的类路径中的文件资源简化了访问。但还有另外一种可能性,就像这个问题的答案中所描述的一样(http://stackoverflow.com/questions/9618483/relative-views-in-view-states-within-a-flow-that-is-loaded-从-A-JAR文件)。 [servlet API](https://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/ServletContext.html#getResource(java.lang.String))描述了这些资源的位置。基本上你的WAR应该包含一个文件夹** META-INF/resources **,你的文件不应该放在类路径中,必须放在那里。 – Markus 2012-03-19 18:23:20

+0

这个答案对我不起作用。我得到一个'IOException'因为找不到文件。另外,我看到下面的评论:“默认情况下,java.io包中的类总是针对当前用户目录解析相对路径名,该目录由系统属性user.dir命名,并且通常是Java虚拟机被调用。“在[java.io.File javadoc](http://docs.oracle.com/javase/6/docs/api/java/io/File.html) – 2012-03-19 23:36:59

+0

根据spring,你需要使用“classpath: MyResource.properties”。你可以在这里找到参考http://static.springsource.org/spring/docs/2.0.x/reference/resources.html – uaarkoti 2012-03-20 01:53:46

相关问题